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

C++ Context-Based Class Implementation

本文关键字:实现 上下文 C++      更新时间:2023-10-16

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

例如,具有多个构造函数的class A是否可以继承对特定构造函数的调用class B,而从对不同构造函数的调用之后的class C继承?

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

不,这在动态上是不可能的。

如果A继承自B,它应该是某种B("is-a"关系(。此关系代表类 A 的所有对象,与上下文无关。

有时想从B继承,有时从C继承,这表明你正在考虑一种"has-a"关系。 这将通过组合来实现:

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. 
    ...
};

如果你的问题不是动态处理,而只是在编译时处理,你可以想到模板:

template <class T>
class A : public T {
    ...
};    
A<B> ab;  // A<B> inherits from B 
A<C> ac;  // A<C> inherits from C
// but attention:  both class are two different classes.  

是的。但不是以你明确提议的方式。继承独立于构造函数 - 因此您无法以这种方式实现这种"特定于上下文"的行为。

这里有几个选项(请注意,还有更多方法可以做到这一点(:

一个相对简单的方法,特别是如果你想隐藏你的类 A 具有类 B 或 C 的特征,是从 B 和 C 私下继承。然后在构造函数中设置一个标志,告诉类使用 B 中的功能或 C 中的功能。然后,所有 A 类方法只需检查该参数并调用相应的 B 或 C 方法。

或者,您可以使用模板。访客模式作为一种基于模板的方法浮现在脑海中,它完成了您似乎描述的内容。