C ++基于上下文的类实现

时间:2015-12-18 22:43:21

标签: c++ class inheritance

C ++中是否有可能class的定义取决于其构造的上下文?

例如,在调用特定构造函数后,具有多个构造函数的class A是否可以从class B继承,而在调用其他构造函数后继承自class C

如果没有,为什么?如果是这样,这将如何实现?

2 个答案:

答案 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方法。

或者,您可以使用模板。访问者模式是一种基于模板的方法,它可以实现您所描述的内容。