注册 登录
编程论坛 C++教室

菜鸟请教:关于虚函数的问题,感谢!

chusan2012 发布于 2012-01-25 17:52, 709 次点击
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;可以这样理解么?

....
 .....
}
6 回复
#2
CooperOne2012-01-25 21:26
这个吧,我最近也是卡在虚函数这里,不过看你的问题更应该属于指针方面的吧。抱歉我答不了,网吧没有VC,dev什么的

给个思路,比方说指针那些问题,设置一些仅含cout的函数,然后分别指向他们,对照着输出就应该知道问题的答案了
#3
BianChengNan2012-01-29 09:12
以下是引用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内存地址中的内容是什么的问题了,这个涉及到类对象内部的内存布局,简单说,虚函数表指针(暂且这么叫吧)放在类对象的头部,虚表中存储的是虚函数的地址(具体是不是我也不太清楚,应该是吧)。
子类中的函数如果覆盖了基类中的函数,那么虚表对应位置的内容变成子类的虚函数的地址,这样就能实现多态。不知道这样说明不明白。可以百度搜索,或者到我签名的网址去看一下,转帖了一篇帖子,讲的挺好的。
#4
elvis_sun2012-01-31 10:55
(B*)pa就是转化为B类指针,(B*)pa与pa的最大不同就是所占内存区域大小,(B*)pa内容并没有变
#5
CooperOne2012-02-05 19:19
是强制转换,试过了
#6
chusan20122012-02-12 23:40
回复 3楼 BianChengNan

多谢兄台~
#7
chusan20122012-02-12 23:41
回复 4楼 elvis_sun
THANKS A LOT~
1