c++ - 虚拟继承与非默认构造函数

标签 c++ constructor language-lawyer virtual-inheritance

此代码被(至少)MSVC、ICC 和 GCC 拒绝:

class A {
public:
    A( int ) {  }
};

class B: virtual public A {
public:
    //B(): A( -1 ) {  } // uncomment to make it compilable
    virtual void do_something() = 0;
};

class C: public B {
public:
    C(): A( 1 ) {  }
    virtual void do_something() {  }
};

int main() {
    C c;
    return 0;
}

基于

error : no default constructor exists for class "A"
    class B: virtual public A {
                            ^
            detected during implicit generation of "B::B()" at line 14

问题:

  1. 如果代码确实无效,究竟如何做到这一点 标准? AFAICT,10.4/2 和 1.8/4 合在一起意味着 B 不能是最派生类的类型,因此来自 12.6.2/10 我们知道 B 永远不能调用 A 的构造函数。 (节号适用于 C++11。)

  2. 如果代码有效,编译器是否违反标准 需要存在他们不可能调用的构造函数? 请注意,不仅他们想从 B::B() 调用 A::A(),而且他们 想在编译 C::C() 时(双重怪异)。

附言这最初是在 ICC 论坛上提出的,但由于不限于此编译器(并且没有详细信息)而张贴在这里。

最佳答案

Clang 将错误显示为:

error: call to implicitly-deleted default constructor of 'B'
    C(): A( 1 ) {  }
    ^

12.1/5 说“如果 [...] 任何 [...] 虚基类 [...] 的类类型为 M [...] 并且 [ ...] M 没有默认构造函数 [...]。”

关于c++ - 虚拟继承与非默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11693512/

相关文章:

c++ - 零延迟麦克风环回、侧音

c++ - C++ 的 Tweener 框架?

Scala问题可选构造函数

delphi - 在delphi中创建时从数据库填充单选组框

c# - 在 C# 中,从构造函数调用虚方法是否安全?

c++ - 使用 std::initializer_list 的 constexpr 的奇怪行为

c++ - C++代码的缓存优化

c++ - 如何在 Windows 上将无效的 fgetpos 调用捕获为 C++ 异常?

c++ - noexcept 和可靠性保证

c++ - 了解构造函数概念