c++ - 使用虚拟继承链接 C++ 构造函数

标签 c++ constructor

在 C# 中跨继承链接构造函数非常方便且有用。在 C++ 中实现类似功能的最佳方式是什么?这就是我想表达的:

struct A
{
    A(int p)
    {
        i = p;
    }

    int i;
};

struct B : virtual A
{
    B(int q) : A(q)
    {
    }
};

struct C : virtual B
{
    C(int r) : B(r) // call B::B() which in turn would call A::A()
    {
    }
};

有什么想法吗?

干杯, 查理。

最佳答案

最派生类(即C)负责构造所有虚基类。因此,C 可以初始化 AB:

C(int r) : A(r), B(r)

请注意,虚拟基类在任何非虚拟基类之前初始化。没有办法让 B 初始化虚拟基类 A

你可以一起破解一些东西,例如通过使虚拟基础 A 默认可构造,然后给它一个 B 可以在其构造函数中调用的“初始化”方法,但这样做可能会被证明是危险的。当为B基类子对象调用B构造函数时,它无法知道是否派生了C的其他基类实际上 A 已经被初始化(并且可能已经使用了 A)或者它是唯一一个将尝试初始化 A 的类>.

关于c++ - 使用虚拟继承链接 C++ 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11939905/

相关文章:

PHP 在构造函数中访问属性

c++ - 解决 vector 的默认构造函数要求?

c++ - C++ 中嵌套模板函数的 const 限定符

c++ - 本土工作队列与英特尔 TBB

c++ - 在 f(x) 中,可以在 f 之前计算 x 吗?

validation - 如何在 Kotlin 中实现验证构造函数?

javascript - 从另一个上下文调用方法时,`this` 未定义

c++ - 在 Poco 1.5.x 中重试锁定的 SQLite 数据库

c++ - 使用 C++ 风格与 C 风格编写 bmp-header

c++ - 内联构造函数对vtable错误的 undefined reference