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