C ++中是否有可能class
的定义取决于其构造的上下文?
例如,在调用特定构造函数后,具有多个构造函数的class A
是否可以从class B
继承,而在调用其他构造函数后继承自class C
?
如果没有,为什么?如果是这样,这将如何实现?
答案 0 :(得分:2)
不,这是不可能动态的。
如果A继承自B,它应该是某种B(“is-a”关系)。这种关系代表A类的所有对象,与上下文无关。
你想有时从B继承,有时从C继承,这表明你正在考虑一个“有一个”的关系。这可以通过组合来实现:
func-name-
如果您的问题不是动态处理的,而是仅在编译时处理,您可以考虑模板:
class B;
class C;
class A {
B *hasB; // of course in real lif you'd use unique_ptr or shared_ptr...
C *hasC;
public:
A(B *b); // would set hasB but set hasC to nullptr.
A(C *c); // would set hasC but set hasB to nullptr.
...
};
答案 1 :(得分:1)
是。但不是以你明确提出的方式。继承与构造函数无关 - 因此您无法以这种方式实现此“特定于上下文”的行为。
这里有几个选项(注意,有更多方法可以做到这一点):
一种相对简单的方法,特别是如果你想隐藏你的类A具有类B或C的特性,就是私有地从B和C继承。然后在构造函数中设置一个标志,告诉类使用来自B或C中的特征。然后,所有A类方法都只检查该参数并调用适当的B或C方法。
或者,您可以使用模板。访问者模式是一种基于模板的方法,它可以实现您所描述的内容。