【发布时间】:2013-01-24 14:19:02
【问题描述】:
我使用的是 Visual Studio 2008、c++、win32,没有点网。
我遇到了在父级的析构函数中调用的虚函数的问题。 例如,学习 a 和 b 类。 a 类有一个虚函数,叫做 Hello();调用时,它会打印 hello。
类b继承自类a,也实现了函数Hello。调用时,它会打印 world。
在类 a 的析构函数中调用函数 Hello。当类 b 被删除时,首先调用 b 的析构函数,然后调用 a 的析构函数。在 a 函数的析构函数中调用 Hello,除了它是与 a 类关联的实现,而不是 b 类。
此行下方此示例的代码。
class a{
public:
virtual void Hello();
a();
~a();
};
a::a(){
};
a::~a(){
Hello();
}
void a::Hello(){
printf("hello\n");
}
class b:public a{
public:
virtual void Hello();
b();
~b();
};
b::b(){
}
b::~b(){
}
void b::Hello(){
printf("world\n");
}
int _tmain(int argc, _TCHAR* argv[]){
a* exampleA=new a();
b* exampleB=new b();
exampleA->Hello();
exampleB->Hello();
delete exampleA;
delete exampleB;
return 0;
}
输出是:
hello
world
hello
hello
当我在 b 类的析构函数中放置断点时,局部变量中的 __vfptr 如下:
__vfptr
[0x0] 0x002314ce b::Hello(void)
当单步进入a类的析构函数时,局部变量中的__vfptr变为:
__vfptr
[0x0] 0x0024c864 a::Hello(void)
我问这正常吗?并且没有(正确的)方法可以在 a 类的析构函数中调用 b 的 Hello 实现?
【问题讨论】:
标签: c++ windows visual-studio