• Index

多重继承

Reads: 1

多重继承的简单使用

多重继承就是派生类继承了多个基类。我们知道继承可以将基类的所有成员都继承下来作为自己的成员,重继承也是一样。

基础示例

#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个基类并且按继承顺序的反序调用 → 基类析构函数执行 → 基类成员变量释放。


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.