C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承之构造函数析构函数

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承之构造函数析构函数相关的知识,希望对你有一定的参考价值。

1. 继承的构造函数与多重继承

如果从多个基类中继承了相同的构造函数(即形参列表完全相同),则程序将产生错误

struct Basel 
	Basel () = default;
	Basel (const std::strings);
	Basel (std::shared_ptr<int>);
;

struct Base2 
    Base2() = default;
    Base2(const std::strings);
    Base2(int) ;
;

// 错误: D1试图从两个基类中都继承 Dl::D1(const strings)
struct Dl: public Basel, public Base2 
	using Basel::Base1;// 从Base1继承构造函数
	using Base2::Base2;// 从 Base2 继承构造函数

如果一个类从它的多个基类中继承了相同的构造函数, 则这个类必须为该构造函数定义它
自己的版本:

struct D2: public Base1, public Base2 
	using Base1::Base1;// 从 Base1继承构造函数
	using Base2::Base2;/ / 从 Base2 继承构造函数
	//D2 必须自定义一个接受 string的构造函数
	D2(const string &s): Base1(s), Base2(s)  
	D2() = default; // 一旦 D2 定义了它自己的构造函数, 则必须出现
;

2. 析构函数

派生类的成员及基类都是自动销毁的。

  • 合成的析构函数体为空。
  • 析构函数的调用顺序正好与构造函数相反, 在我们的例子中, 析构函数的调用顺序是
    'Panda、 'Endangered、 'Bear和~ZooAnimal

3. 派生类的拷贝与移动操作

派生类如果定义了自己的拷贝/赋值构造函数和赋值运算符, 则必须在完整的对象上执行拷贝、 移动或赋值操作。

只有当派生类使用的是合成版本的拷贝、 移动或赋值成员时, 才会自动对其基类部分执行这些操作。 在合成的拷贝控制成员中, 每个基类分别使用自己的对应成员隐式地完成构造、 陚值或销毁等工作。

eg.

step1. 调用 Bear 的拷贝构造函数, 后者又在执行自己的拷贝任务之前先调用 ZooAnimal 的拷贝构造函数。
step2. 调用 Endangered的拷贝构造函数来创建对象相应的部分
step3. Panda的拷贝构造函数

Panda ying_yang ("ying_yang" );
Panda ling_ling = ying_yang;//使用拷贝构造函数

以上是关于C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承之构造函数析构函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 18 大型程序工具)noexcept

C++ Primer 5th笔记(chap 18 大型程序工具)异常处理

C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常

C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性

C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间

C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承