欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-21 10:52:34
...

简要结论: 
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