• 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;
    }

     

  • 相关阅读:
    优卡特脸爱云一脸通智慧管理平台权限绕过漏洞复现(CVE-2023-6099)
    JS超集对TypeScript的Map对象以及联合类型的深入实战
    色彩空间
    c++day4
    Vue框架--Vue中的数据代理
    【CNN记录】pytorch中argMax、argMin
    vue实现el-tree操作后默认展开该节点和同级节点拖拽并进行前后端排序
    Python面向对象编程
    合肥先进光源束测专用网络的规划-续
    java使用phantomjs生成证书图片
  • 原文地址:https://blog.csdn.net/liuxunfei15/article/details/126378239