20200228

@ShiKaiWi

Plan

60min: CPP

Notes

析构继承

  • 虚析构函数不定义的话,派生类当被动态绑定到一个指针上面的时候,在delete 的时候,无法正常触发析构函数
  • 虚析构函数的定义会阻止默认的移动合成函数
  • 析构顺序是派生类->基类

拷贝控制继承

  • 有一个需要强调的是,如果定义了拷贝构造函数(即使是定义成 delete 的),则不会生成移动合成函数,类似的,如果定义了移动构造函数,那么就不会自动生成拷贝合成函数。
  • 其他的情况很复杂,遇到在自己积累吧。

构造继承

  • 对于含有默认实参的基类构造函数,派生类会继承到多个,比如基类有一个构造函数,有两个形参,其中有一个存在默认实参,那么派生类会继承两个构造函数,一个是和基类一样的,还有一个是忽律了带有默认实参的形参的构造函数。

练习代码:

#include <iostream>

class Base {
public:
  int i;
  Base() = default;
  Base(int i) : i(i) {}
  Base(int i, int j = 1) : i(i + j) {}
  virtual ~Base() { std::cout << "Destroy Base" << std::endl; }
  virtual void double_price() {
    std::cout << "Base double price" << std::endl;
  };
};

class Derived : public Base {
public:
  int m;
  using Base::Base;
  void double_price(int x) {
    std::cout << "Derived double price: x:" << x << std::endl;
  }
  ~Derived() { std::cout << "Destroy Derived" << std::endl; }
};

void test_destroy() {
  Base *b = new Derived(10, 10);
  delete b;
}

int main() {
  test_destroy();
  return 0;
}

More