如果我有两个这样的课程:
class A
{
public:
virtual print(){};
~A(){print();}
};
class B:public A
{
public:
print(){};
~B(){}
};
void main()
{
B *b1=new B;
delete b1;
}
在类A的析构函数中的是否从A类调用print而不是从B调用print,因为当它在A类析构函数中时,B类在技术上被破坏了?
答案 0 :(得分:1)
是的,没错。通过为自己调用析构函数来破坏类,然后为其父类调用析构函数,这意味着当你破坏A时,B已经消失了。如果在构造时调用基类中的虚拟覆盖函数,则会看到类似的行为。
在构造函数或析构函数中调用虚函数通常被认为是不好的做法,因为行为虽然明确定义,但可能会误导未经证实的人。即使你被发起,也很容易让自己绊倒。