标题:菜鸟请教:关于虚函数的问题,感谢!
只看楼主
chusan2012
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-1-25
结帖率:0
已结贴  问题点数:20 回复次数:6 
菜鸟请教:关于虚函数的问题,感谢!
class A
{
 public:
 virtual void show(){cout<<"class A"<<endl;}
};class B:public A
{
 public:
 void show(){}{cout<<"class B"<<endl;}
};
class C:public B
{
 public:
 void show(){}{cout<<"class C"<<endl;}
};void main()
{
 A a,*pa=&a;
 B b,*pb=&b;
 C c;
 pa=&b;
 pa->show();
 pa=&c;
 pa->show();
 ((B*)pa)->show(); //(B*)pa是将pa强制转换成转换成指向B类的指针,还是指向B类对象的指针?如果是后者,那么是B类无名对象的指针么?也就是((B*)pa)->show()即用指向B类无名对象的指针pa访问该对象的show()函数,由于B类的show()延续了A中的virtual属性,结果访问的是派生类C中的show函数,显示:class C;可以这样理解么?

....
 .....
}
搜索更多相关主题的帖子: class void public 虚函数 
2012-01-25 17:52
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
得分:7 
这个吧,我最近也是卡在虚函数这里,不过看你的问题更应该属于指针方面的吧。抱歉我答不了,网吧没有VC,dev什么的

给个思路,比方说指针那些问题,设置一些仅含cout的函数,然后分别指向他们,对照着输出就应该知道问题的答案了

蹲得越低,跳得越高.
2012-01-25 21:26
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
得分:7 
以下是引用chusan2012在2012-1-25 17:52:47的发言:

class A
{
 public:
 virtual void show(){cout<<"class A"<
pa=&c;pa指向的是c类的对象,这个没问题吧, ((B*)pa)->show(); 虽然用B*进行了强制转换,但是pa所指向的内存地址中的内容是不变的,这个能明白吧。
最后就是pa内存地址中的内容是什么的问题了,这个涉及到类对象内部的内存布局,简单说,虚函数表指针(暂且这么叫吧)放在类对象的头部,虚表中存储的是虚函数的地址(具体是不是我也不太清楚,应该是吧)。
子类中的函数如果覆盖了基类中的函数,那么虚表对应位置的内容变成子类的虚函数的地址,这样就能实现多态。不知道这样说明不明白。可以百度搜索,或者到我签名的网址去看一下,转帖了一篇帖子,讲的挺好的。

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-01-29 09:12
elvis_sun
Rank: 2
等 级:论坛游民
帖 子:5
专家分:15
注 册:2012-1-30
得分:7 
(B*)pa就是转化为B类指针,(B*)pa与pa的最大不同就是所占内存区域大小,(B*)pa内容并没有变
2012-01-31 10:55
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
得分:0 
是强制转换,试过了

蹲得越低,跳得越高.
2012-02-05 19:19
chusan2012
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-1-25
得分:0 
回复 3楼 BianChengNan

多谢兄台~
2012-02-12 23:40
chusan2012
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-1-25
得分:0 
回复 4楼 elvis_sun
THANKS A LOT~
2012-02-12 23:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360005-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.347354 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved