C++ 虚拟多重继承构造函数

C++ 虚拟多重继承构造函数

问题描述

我正在处理一个使用虚拟继承和多重继承的C++代码示例。在我的代码中,我注意到我必须在每个派生类中调用 Base 类的构造函数,即使传递给基类构造函数的值没有被使用。为什么这是必要的?我能否避免在每个派生类中调用基类构造函数,只在 Combined 类中调用它?

#include <stdio.h>

class Base
{
    public:
        Base(int n) : n(n) {}
        int n;
};

class AddsSomething1 : virtual public Base
{
    public:
        AddsSomething1() : Base(1)
        {
            printf("AddsSomething1(): base %d\n", this->n);
        }

        int something1;
};

class AddsSomething2 : virtual public Base
{
    public:
        AddsSomething2(): Base(2)
        {
            printf("AddsSomething2(): base %d\n", this->n);
        }

        int something2;
};

class AddsSomething3 : virtual public Base
{
    public:
        AddsSomething3() : Base(3)
        {
            printf("AddsSomething3(): base %d\n", this->n);
        }

        int something3;
};

class Combined : public AddsSomething1, public AddsSomething2, public AddsSomething3
{
    public:
        Combined(int n) : Base(123)
        {
            printf("Combined(): base %d\n", this->n);
        }
};

int main()
{
    Combined(123);
}

输出:

AddsSomething1(): base 123
AddsSomething2(): base 123
AddsSomething3(): base 123
Combined(): base 123

解决方案

每个派生类型都必须调用虚基类的构造函数,因为只有最终派生类型的构造函数才会真正调用虚基类的构造函数。继承链中的其他基类会得知虚基类已经被构造并跳过这一步骤。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程