联合虚拟继承

时间:2017-08-01 13:20:23

标签: c++ inheritance

我试图实现以下继承关系。

         Variable
       /         \
... GlobalVar  LocalVar ...
       \         / (either)
       ExtendedVar // Essentially with more fields

我基本上希望它扩展Variable的一个子类,并在运行时进行选择。虚拟继承并没有完全解决问题。如果ExtendedVar继承GlobalVarLocalVar,当我需要调用某个成员函数时,我无法指定要用于该函数的基类。

此代码似乎有效。

class ExtendedVar : public Variable /* ExtendedVar is-a Variable */ {
    Variable& var; // wraps a var in it. This is the var to extend.
    std::string some_field;
}

但它在继承中带有不必要的A副本。或者我可以再增加一些类似ExtendedGlobalVarExtendedLocalVar的类,这对于维护来说显然是不好的。

有更好的选择吗?

1 个答案:

答案 0 :(得分:2)

  

我基本上希望它扩展Variable的一个子类,并在运行时进行选择。

要具有运行时多态性,必须间接引用对象。基地不能是间接的,但普通成员可以。因此,您建议的继承是不可能的,但组成是:

struct ExtendedVar {
    std::unique_ptr<Variable> var;
};
  

或者我可以再使用一些类,如ExtendedGlobalVar和ExtendedLocalVar,这些类显然不利于维护。

如果这是一个选项(即使是坏选项),那么听起来基本的选择不必在运行时完成。

在这种情况下,您可以使用模板生成具有您选择的基础的类,而无需单独维护每个变体:

template <class Base>
struct ExtendedVar : Base {
    // things common to all extended variables
};

ExtendedVar<GlobalVar> an_extended_global_variable;