虚拟多重继承构造函数

virtual multiple inheritance constructor

提问人:mopalinski 提问时间:10/21/2023 更新时间:10/21/2023 访问量:66

问:

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

#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
C++ 虚拟继承

评论


答:

1赞 SoronelHaetir 10/21/2023 #1

必须从每个派生类型调用虚拟基的构造函数,因为它始终是且唯一实际调用虚拟基构造函数的最多派生类型构造函数。继承链中的所有其他基点都会知道虚拟基库已经构建完毕,并跳过该步骤。

评论

0赞 Captain Giraffe 10/21/2023
我明白你想说什么,但我很难理解你的意思 其他基地......
0赞 SoronelHaetir 10/21/2023
假设你有 struct V1 { ... };struct B1 : 虚拟 V1 { ... };struct B2 : 虚拟 V1 { ... };结构体 D : B1, B2 { ... };如果没有虚拟,树中将有两个 V1 实例,构造顺序为 V1、B1、V1、B2、D。对于虚拟,它是 V1、B1、B2、D。类型只知道它是最派生的,因为虚拟基尚未初始化。
0赞 mopalinski 10/21/2023
这条规则有例外吗?我也在玩模板,我想我找到了一个例子,我不必从派生类中调用 Base()。我可以联系你们吗?
0赞 SoronelHaetir 10/21/2023
@PoProstuMieciek :如果虚拟基具有默认构造函数,则不需要显式调用它。但是,这样的构造函数将像往常一样被调用,只是由最派生的类型而不是最左边的直接基调用。
0赞 阴阳战士 10/21/2023 #2

不,您无法避免调用父类构造函数,因为它们是隐式调用的。 此外,您不需要显式调用它们。 你知道,如果不调用它们,我们就无法想象成功的继承。

谢谢。