class A{
    public:
        A(){p();}
        virtual void p(){print("A")}
        virtual ~A(){p();}
};
class B:public A{
    public:
        B(){p();}
        void p(){print("B")}
        ~B(){p();}
};
int main(int, char**){
        A* a=new B();
        delete a;
}

这段程序的输出:ABBA

 

题目想构造一个B类的对象,B继承自A,所示首先构造A,A中构造函数调用P,虽然P是虚函数,按理来说应该动态绑定,但是此时B并没有被构造,所以只能调用自己的P函数(输出A),接下来构造B,调用B的P函数(输出B),接着析构从派生类到基类,首先析构B,调用B的P函数(输出B),接着调用A的析构函数,按理来说应该动态绑定,但是此时B已经被析构,所以只能调用自己的P函数(输出A)。
 
解释就是上面的,但是C++不推荐在构造/析构函数中调用虚函数进行动态绑定,详情请看Effective C++。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-27
  • 2021-10-31
  • 2021-07-11
  • 2022-12-23
  • 2021-11-14
  • 2022-01-25
  • 2022-12-23
相关资源
相似解决方案