美文网首页
C++ 析构函数 何时 加 Virtual ?

C++ 析构函数 何时 加 Virtual ?

作者: b036101467d7 | 来源:发表于2019-05-23 10:17 被阅读0次

首先Virtual用于类的多态,当设计一个类,用做其他类的父类时,且有Virtual修饰的方法,这些方法可被子类覆盖定义,此时的析构函数必须加Virtual。原因如下:上述场景一般使用工厂设计模式,定义一个父类的指针,指向子类对象,而在delete 父类指针时,期望释放对象。但父类析构函数不加Virtual修饰,则只会调用父类析构函数,而不调用子类析构函数,导致只释放了对象的父类部分,而子类部分没有释放。Virtual含义就是有一个函数映射表,调用时会去查映射表调用对应的方法。

例如:

class Test {
public:
          Test(int test) : mTest(test){}
          virtual ~Test(){
                  std::cout << "In ~Test" << std::endl;
          }

          virtual int getTest() {
                return mTest++;
          }
private:
    int mTest;
};

class TestA : public Test {
public:
         TestA(int test) : mTestA(test){}
         ~TestA(){
              std::cout << "In ~TestA" << std::endl;
          }
          int getTest() {
              return mTestA++;
          }
private:
      int mTestA;
}

class TestB : public Test {
public:
         TestB(int test) : mTestB(test) {}
          ~TestB(){
                std::cout << "In ~TestB" << std::endl;
          }

          int getTest(){
              return mTestB++;
          }
private:
        int mTestB;
};

Test *pTest = new TestA(100);
......
delete pTest;

上述Test *pTest = new TestA(100);执行后,父类Test的指针指向子类TestA对象,在delete pTest时
将只会调用Test的析构函数,而不会调用TestA的析构函数。

上述只是简单验证,一般使用时,可能涉及到多个子类,使用工厂方法,同样会有这样的问题。因此
对于:父类有方法被子类被覆盖的,同时使用的是指向父类的指针时,切记一定将父类析构函数定义为virtual。

另一方面,如果一个类,不会被继承,则不应该定义析构函数或者其他函数为virtual,否则会导致类的对象占用空间增大。

相关文章

  • C++ 析构函数 何时 加 Virtual ?

    首先Virtual用于类的多态,当设计一个类,用做其他类的父类时,且有Virtual修饰的方法,这些方法可被子类覆...

  • 如何写C++基类析构函数?

    可以看到,派生类的析构函数没有被调到。解决方法是,在基类的析构函数前加virtual。

  • [C++] virtual析构函数

    有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived class...

  • 简介python中的析构函数与构造函数

    python的构造和析构函数为固定的名字。 构造函数 析构函数 不像c++中那样构造函数和析构函数是类名字。并且在...

  • 条款 07:为多态基类声明 virtual 析构函数

    《Effective C++ 中文版 第三版》读书笔记 ** 条款 07:为多态基类声明 virtual 析构函数...

  • [C++之旅] 13 析构函数

    [C++之旅] 13 析构函数 析构函数与构造函数相反,构造函数在实例化一个对象时调用,而析构函数在销毁一个对象时...

  • 2020-02-10 C++基础2

    1:为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 将可能会被继承的父类的析构函数设置为虚...

  • ★03.关于单继承

    基类总是要写虚析构函数 通过设置析构函数为纯虚函数来让类称为抽象基类 代码 函数virtual属性的传递性 拷贝移...

  • c++构造函数,析构函数,调用顺序

    最近,在看c++,聊一个简单的话题吧。构造函数,析构函数,及调用顺序。 构造函数, 构造函数,析构函数,如上代码所...

  • 《Effective C++》学习笔记(3)

    2 构造/析构/赋值运算(续) 条款09:绝不在构造和析构过程中调用 virtual 函数 如果执行BuyTran...

网友评论

      本文标题:C++ 析构函数 何时 加 Virtual ?

      本文链接:https://www.haomeiwen.com/subject/wdamzqtx.html