100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

时间:2019-04-15 18:36:29

相关推荐

【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

加qq1126137994 微信:liu1126137994 一起学习更多技术!!!

问题一:构造函数与析构函数可以成为虚函数么?

答案:

1、构造函数不可以成为虚函数

因为在构造函数执行结束后,虚函数表指针才被正确的初始化完成

2、析构函数可以成为虚函数

建议在设计类时,尤其是存在继承的类时,将析构函数设计为虚函数

问题二:构造函数与析构函数中会发生多态行为么?

答案:

1、构造函数中不可能发生多态行为:

因为在构造函数执行结束前,虚函数表指针没有正确的初始化完成

2、析构函数中不可能发生多态行为:

因为在析构函数执行时,虚函数表指针已经被销毁

如果构造函数与析构函数中调用了虚函数,那么只调用当前类中定义的虚函数版本

看下面的实例程序:

#include <iostream>#include <string>using namespace std;class Base{public:Base(){cout << "Base()" << endl;func();//在构造函数中不会发生多态行为,虽然func()函数为虚函数//但是编译器不会去动态绑定,会直接调用本类中的成员函数}virtual void func() {cout << "Base::func()" << endl;}virtual ~Base(){func(); //在析构函数中也不会发生多态行为,当编译器发现析构函数中有虚函数时//编译器不会实现动态绑定的行为,而是直接调用本类中的成员函数cout << "~Base()" << endl;}};class Derived : public Base{public:Derived(){cout << "Derived()" << endl;func();//在构造函数中不会发生多态行为,虽然func()函数为虚函数//但是编译器不会去动态绑定,会直接调用本类中的成员函数}virtual void func(){cout << "Derived::func()" << endl;}~Derived(){func();//在析构函数中也不会发生多态行为,当编译器发现析构函数中有虚函数时//编译器不会实现动态绑定的行为,而是直接调用本类中的成员函数cout << "~Derived()" << endl;}};int main(){Base* p = new Derived();// ...delete p;return 0;}

运行结果为:

Base()

Base::func()

Derived()

Derived::func()

Derived::func()

~Derived()

Base::func()

~Base()

由运行结果,我们也很容易看出上面相关结论的正确性!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。