1、构造函数、析构函数可以写成虚函数么?

构造函数:不行

原因:

1、因为创建一个对象时要确定对象的类型,而虚函数是在运行时确定其类型的,而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型。

2、虚函数对应一个虚表,可是这个虚表其实是存储在对象的内存空间的。如果构造函数是虚的,就需要通过虚表来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找虚表呢?所以构造函数不能是虚函数。

析构函数:可以

原因:

1、在多态当中,基类的方法被定义成 虚函数,才可以通过基类指针动态调用派生类的方法,同理当我们delete 基类指针,如果基类析构函数不是虚函数,就无法动态调用到派生类的析构函数,导致派生类的对象无法析构,造成内存泄漏。反之,基类析构函数被定义成 虚函数的时候,delete基类指针时,会先 析构派生类对象,再 析构基类对象。

示例:

#include
using namespace std;

class FatherA
{
private:
    /* data */
public:
    FatherA(/* args */){}
    ~FatherA()
    {
        cout << "我不是虚函数,正在析构基类FatherA"<     }

};

class FatherB
{
private:
    /* data */
public:
    FatherB(/* args */){}
    virtual ~FatherB()
    {
        cout << "我是虚函数,正在析构基类FatherB"<     }

};

class Child:public FatherA,public FatherB
{
private:
    /* data */
public:
    Child(/* args */);
    ~Child();
};

Child::Child(/* args */)
{
}

Child::~Child()
{
    cout << "析构派生类child"< }

int main()
{
    FatherA *A = new Child();
    FatherB *B = new Child();
    cout<<"start delete A"<     delete A;
    cout<<"end delete A"<

    cout<<"start delete B"<     delete B;
    cout<<"end delete B"<     
    return 0;
}

1、构造函数、析构函数可以写成虚函数么?_第1张图片

 

你可能感兴趣的:(c++,面试,c++,面试)