This page looks best with JavaScript enabled

Interview::C++虚函数-构造函数

 ·  ☕ 2 min read

Subject C++ 构造函数可以是虚函数吗? 析构函数可以是虚函数吗?

  • 1.构造函数不能为虚函数

    • 当我们将构造函数定义为虚函数时,会直接报错:

    • 首先回忆下以前学的virtual虚函数概念:

    • 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存空间上额外分配一个虚函数表.

    • 虚函数表的作用在于,存储每个类的相同的虚函数名,然后每一次虚函数调用,都会去虚函数表查找地址

    • 分析:

    • 假如构造函数是虚函数的话,由于对象开始还未分配内存空间,所以根本就无法找到虚函数表,从而构造函数也无法被调用.所以构造函数是不能成为虚函数.

    • 2.析构函数可以为虚函数

    • 首先回忆下析构函数:

    • 当某个内对象被注销时,编译器会自动顺序调用该类以及其父类的析构函数,而不会调用派生类的析构函数.

    • 虚析构函数的好处

    • 假如我们通过派生类生成基类对象时,如果析构函数是虚函数,则我们释放其基类对象时,能使整个类(包括派生类)对象完全释放,如果析构函数只是普通函数,则不能析构完全.

    • 分析:

    • 所以当我们在用多态的时候(通过基类来调用派生类成员函数),析构函数最好为虚函数

    #include
    using namespace std;

    class ClassBase
    {
    public:
    ClassBase(){};
    virtual ~ClassBase()
    {
    cout«"~ClassBase()"«endl;
    }

    virtual void func()                         //虚函数成员
    {
        cout<<"ClassBase: func()"<<endl;
    }
    

    };

    class ClassDerived : public ClassBase
    {
    public:
    ClassDerived(){};
    ~ClassDerived()
    {
    cout«"~ClassDerived()"«endl;
    }
    void func() //虚函数成员
    {
    cout«“ClassDerived: func()"«endl;
    }
    };

    int main()
    {
    ClassBase *p = new ClassDerived;

     p->func();                   //通过多态来调用派生类虚函数
    
     delete p;
    
     return 0;
    

    }

    • 打印如下:

    • ClassBase: func()

    • ~ClassDerived()

    • ~ClassBase()

    c++ malloc和new的区别

  1. malloc()用于动态分配内存,而new用于分配并初始化一个对象。

  2. malloc()函数返回一个指向所分配内存的指针,而new操作符返回一个指向新建对象的引用。

  3. malloc()函数只是分配内存,但不会调用构造函数,而new操作符会调用构造函数。

  4. malloc()函数会返回一个void指针,而new会返回一个正确类型的指针。

  5. malloc()函数可以用来分配任意类型的数据,但new操作符只能用来分配对象。

  6. malloc()函数不会自动释放分配的内存,而new操作符会自动调用析构函数来释放内存。

Share on

James
WRITTEN BY
James
Unity Developer