c++ - 可以为间接基类共享基类实例吗?

标签 c++ inheritance

我必须承认我在表述这个问题时遇到了困难,但我会尽力做到准确。我试图寻找我的问题的答案,但我怀疑我无法找到我正在寻找的东西,因为我不确定如何调用它。

我有一个基类 A,以及几个继承自该基类的子类。然后,我创建了另一个类 X,它继承了一些提到的子类。我现在面临的问题是 X 继承的每个类都有自己的 A 类实例。下面的代码应该可以更好地理解我的意思。

class A;
class B : public A;
class C : public A;

class X : public B, public C;

当 B 类和 C 类都作为同一类的间接基类时,是否有办法使它们共享 A 类的同一个实例?

为了举例说明我为什么想要这个,让我们看一下这段代码。

    class A
    {
        int _x;
    };

    class B : public A
    {
        void outputX(){std::cout << A::_x << std::endl;
    };

    class C : public A
    {
       void setX(int x){A::_x=x;}
    };

    class X : public B, public C
    {
        C::setX(5);

        // this will output an un-initialized _x, 
        // as B and C have their own version of A
        B::outputX() 
    };

现在我意识到在这个例子中这似乎是不必要的,但在我的实际情况下,我认为如果 B 和 C 在类 X 中共享 A 的实例将是一个很好的解决方案。

这有可能吗?

最佳答案

你可以通过使用虚拟继承来解决这个问题:

class B : virtual public A;
class C : virtual public A;

class X : virtual public B, virtual public C;

查看更多信息 the diamond problem .

关于c++ - 可以为间接基类共享基类实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259303/

相关文章:

c++ - 使用 VS2019 为 Linux 编译我的 C++ exe

java - 使用 Intent 在 Activity 之间传递自定义对象

c# - 继承一个没有任何构造函数的抽象类

ruby-on-rails - 如何打开一个类并将其转换为 ActiveRecord 对象? (例如,让它继承ActiveRecord::Base)

c++ - 一个简单的 cout 语句打印,一个变量打印,一个 for 循环不会打印

c++ - 我是否正确地执行了这个程序?

c++ - 使用 assign、substring 和 find 方法解析空白字符串

c++ - 自定义 Qt 库类

c++ - 错误 : out-of-line definition of 'test' does not match any declaration in 'B<dim>'

javascript - 如何扩展 AudioNode(没有构造函数的原生对象)