我试图实现以下继承关系。
Variable
/ \
... GlobalVar LocalVar ...
\ / (either)
ExtendedVar // Essentially with more fields
我基本上希望它扩展Variable
的一个子类,并在运行时进行选择。虚拟继承并没有完全解决问题。如果ExtendedVar
继承GlobalVar
和LocalVar
,当我需要调用某个成员函数时,我无法指定要用于该函数的基类。
此代码似乎有效。
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副本。或者我可以再增加一些类似ExtendedGlobalVar
和ExtendedLocalVar
的类,这对于维护来说显然是不好的。
有更好的选择吗?
答案 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;