C++继承、成员和冗余数据

C++ inheritance, members and redundant data

本文关键字:冗余 数据 成员 继承 C++      更新时间:2023-10-16

我有两个类Foo和Bar,有多余的成员。 我想要一个第三类 FooBar 来保存两种类型的成员,我可以将其传递给期望任一类型的函数(可能带有强制转换(,而不是浮动所有内容的两个副本。

class Foo{
public:
    A a;
    B b;
    C c;
};
class Bar{
    A a;
    B b;
    D d;
};
class FooBar{
    A a;
    B b;
    C c;
    D d; 
};

在 c++ 中,是否可以在不修改使用 A 或 B 的代码(或最多更改代码期望的类型(以及不制作无关副本或保留冗余数据的情况下执行此操作?简单继承保留重复数据。有一个公共基类和虚拟继承在 clang 下编译,但似乎不起作用。

编译器

无法知道Foo::aBar::a引用同一件事。这在你的程序中可能是逻辑上的,但这肯定不会在代码的任何地方强制执行。

如果它们真的意味着同样的事情,你可能想要有一个共同的基础:

class AB {
public:
    A a;
    B b;
};

并在其他任何地方使用虚拟继承:

class Foo : public virtual AB {
public:
    C c;
};
class Bar : public virtual AB {
public:
    D d;
};
class FooBar : public Foo, public Bar {
};

这样,只有一个FooBar::a.