什么时候应该调用虚基类的构造函数?

问题描述 投票:0回答:1

考虑以下示例:

struct Grandpa {
    Grandpa(int x) {}
};

struct Dad : Grandpa {
    Dad(int y) : Grandpa(15) {}
};

struct Son : Dad {
    Son(int z) : Dad(z) {}
};

int main () {
    Son s(10);
}

它编译得很好,但是,如果我使

Grandpa
不只是
Dad
的基类,而是虚拟基类:

struct Grandpa {
    Grandpa(int x) {}
};

struct Dad : virtual Grandpa {
    Dad(int y) : Grandpa(15) {}
};

struct Son : Dad {
    Son(int z) : Dad(z) {}
};

int main () {
    Son s(10);
}

此代码无法编译!编译失败并显示

example.cpp: In constructor ‘Son::Son(int)’:
example.cpp:12:27: error: no matching function for call to ‘Grandpa::Grandpa()’
   12 |         Son(int z) : Dad(z) {}

根据 C++ 标准,关于虚拟基类的构造函数调用有哪些规则?

c++ c++17 language-lawyer virtual-inheritance
1个回答
0
投票

每当您使用(直接或间接)虚拟基类创建类的实例时,该顶级构造函数必须调用虚拟基类的构造函数。中间类中对虚拟基的任何构造函数调用都将被忽略。

在您的情况下,您正在创建一个

Son
并且其构造函数没有对
Grandpa
的显式调用,因此它会隐式调用
Grandpa()
(这会导致您看到的错误)。
Dad
的构造函数中存在或不存在任何调用都是无关紧要的;它总是会被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.