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

     

  • 相关阅读:
    网页全屏自定义内容如何实现?
    Python多线程与GIL锁
    2022_08_09__106期__二叉树
    国产开发板——香橙派Kunpeng Pro的上手初体验
    Vuex快速入门
    Sqoop的columns到底是用来干什么的
    化学制药行业数字化供应链管理平台:精准数据采集,助力产业数字化升级
    报表工具,应该适用哪种部署方式?_光点科技
    474. 一和零
    Golang trace分析
  • 原文地址:https://blog.csdn.net/liuxunfei15/article/details/126378239