析构函数可以调用虚函数,构造函数为什么不可以调用虚函数

简要结论: 
1. 从语法上讲,调用完全没有问题。 
2. 但是从效果上看,往往不能达到需要的目的。 
Effective 的解释是: 
派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。 
同样,进入基类析构函数时,对象也是基类类型。
 

所以,虚函数始终仅仅调用基类的虚函数(如果是基类调用虚函数),不能达到多态的效果,所以放在构造函数中是没有意义的,而且往往不能达到本来想要的效果。

  • 在构造函数中调用
#include<iostream>
using namespace std;

class Base
{
public:
    Base()
    {
       Fuction();
    }

    virtual void Fuction()
    {
        cout << "Base::Fuction" << endl;
    }
};

class A : public Base
{
public:
    A()
    {
      Fuction();
    }

    virtual void Fuction()
    {
        cout << "A::Fuction" << endl;
    }
};

// 这样定义一个A的对象,会输出什么?
int main()
{
    A a;
}

输出: 
Base::Fuction 
A::Fuction

  • 在析构函数中调用:
#include <iostream>
using namespace std;

class A{
public:
    virtual void show(){
        cout<<"in A"<<endl;
    }
    virtual ~A(){show();}
};

class B:public A{
public:
    void show(){
        cout<<"in B"<<endl;
    }
};

int main(){
    A a;
    B b;
}

输出: 
in A 
in A

猜你喜欢

转载自blog.csdn.net/weixin_41066529/article/details/90144179
今日推荐