C++继承与虚函数

C++继承与虚函数

在面向对象编程过程中,为实现多态,常用基类指针指向派生类对象操作以动态绑定;
此时继承体系中,基类应采用虚析构函数( virtual ~Demo() )来防止派生类内存泄漏;

示例代码

示例代码如下:

class Base {
public:
    virtual ~Base() {
        cout << "~Base()" << endl;
    }
    virtual void doSth();
};

class Derived1 : public Base {
public:
    ~Derived1() {
        cout << "~Derived1()" << endl;
    }
    virtual void doSth() override;
};

class DerivedFromDerived1 : public Derived1 {
public:
    ~DerivedFromDerived1() {
        cout << "~DerivedFromDerived1()" << endl;
    }
};

class Derived2 : public Base {
public:
    ~Derived2() {
        cout << "~Derived2()" << endl;
    }
    virtual void doSth() override;
};


using namespace std;

int main() 
{
    vector<Base*> bases = {
        new Derived1(),
        new Derived2("Bob")    
    };
    
    for (const Base* aBase : bases) {
        aBase->doSth();
    }
    
    for (int i = 0; i < bases.size(); ++i) {
        delete base[i];    
    }
    
    
    Base* base2 = new DerivedFromDerived1();
    delete base2;
    
    return 0;
}

良好习惯

在开发实践中,我们总结了如下良好习惯以减少代码中的在继承与虚函数方面的隐患:

  • 若类中没有继承关系,禁止随意加上虚函数 virtual 声明;
  • 当类含有继承时,基类析构函数中加上 virtual 关键字声明;
  • 继承体系中基类与子类的虚函数均加上 virtual 声明;
  • 继承体系中使用C++11中的 override、final、delete、default 等关键字;
  • 避免多继承,避免三层以上继承;
  • 使用组合代替继承;
  • 若无法避免继承,则要事先设计良好的继承体系(如严格树形结构);

上述条目仅供参考,也许有的并不适合某些开发场景,不喜勿喷;


本文作者: 王同学