【问题标题】:C++ inheritance, members and redundant dataC++ 继承、成员和冗余数据
【发布时间】:2014-12-20 20:25:11
【问题描述】:

我有两个类 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 下编译,但似乎不起作用。

【问题讨论】:

  • 使用联合怎么样?
  • 如果您想将FooBar 传递给需要FooBar 的函数,您将需要使用继承。
  • 我认为设计有缺陷。类应该建模行为而不仅仅是数据。
  • @Pradhan:工会会破坏这里的东西。
  • @Cornstalks 啊,我误读了这个问题,没有意识到他想要一个 FooBar 的集合论联合 :)

标签: c++ inheritance


【解决方案1】:

编译器无法知道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 就只有一个了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多