小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/
目录
多重继承的简单使用
多重继承就是派生类继承了多个基类。我们知道继承可以将基类的所有成员都继承下来作为自己的成员,重继承也是一样。
基础示例
#include <iostream> // std::cout std::endl
class base1
{
public:
void show(void) const noexcept;
};
class base2
{
public:
void print(void) const noexcept;
};
class derived : public base1, public base2
{
};
int main(void)
{
derived x;
x.show();
x.print();
return 0;
}
void base1::show(void) const noexcept
{
std::cout << "基类1的show()函数" << std::endl;
}
void base2::print(void) const noexcept
{
std::cout << "基类2的print()函数" << std::endl;
}
基础讲解
派生类使用多重继承的格式如下:
class 派生类 : public 基类1, public 基类2, public 基类3
上面代码的派生类将基类1的show()
函数和基类2的print()
函数都继承下来。
多重继承与单继承基本上差不多,所以接下来只说差异和需要注意的事项。
多重继承的调用顺序
基础示例
#include <iostream> // std::cout std::endl
class base1
{
public:
base1(void);
~base1(void);
};
class base2
{
public:
base2(void);
~base2(void);
};
class derived : public base2, public base1
{
public:
derived(void);
};
int main(void)
{
{
derived x;
}
return 0;
}
base1::base1(void)
{
std::cout << "基类1构造函数" << std::endl;
}
base1::~base1(void)
{
std::cout << "基类1析构函数" << std::endl;
}
base2::base2(void)
{
std::cout << "基类2构造函数" << std::endl;
}
base2::~base2(void)
{
std::cout << "基类2析构函数" << std::endl;
}
derived::derived(void)
: base1()
, base2()
{
}
输出结果:
基类2构造函数
基类1构造函数
基类1析构函数
基类2析构函数
基础讲解
派生类继承基类的顺序是2→1,派生类调用基类构造函数是1→2,而输出结果是2→1。因此多重继承的基类构造函数调用顺序就是继承基类时的顺序。而析构函数相反。
多重继承的调用顺序总结
通过上面的示例,再结合之前的教程示例,可以总结出下面的调用顺序:
派生类对象的创建顺序:(基类成员变量创建和初始化 → 基类构造函数执行) × n个基类并且按继承顺序调用 → 派生类成员变量创建和初始化 → 派生类构造函数执行。
派生类对象的释放顺序:(派生类析构函数执行 → 派生类成员变量释放) × n个基类并且按继承顺序的反序调用 → 基类析构函数执行 → 基类成员变量释放。