我正在使用 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 实现?