假设我有这个类:
class A {
protected:
int x,y;
double z,w;
public:
void foo();
void bar();
void baz();
};
我在我的代码和其他人的代码中定义和使用了A。现在,我想编写一些库,可以很好地操作A,但实际上更通用,并且能够操作:
class B {
protected:
int y;
double z;
public:
void bar();
};
我希望我的库是通用的,因此我定义了一个B类,并且它的API采用这种方式。我想要告诉编译器 - 不在我不再控制的A的定义中,而在其他地方,可能在B的定义中:
请尝试将B视为A的超类。 因此,请按特定方式排列内存,以便如果我将A *重新解释为B *,则期望B *的代码将起作用。 然后请实际接受A *作为B *(及A和B&等)。
在C ++中,我们可以采用相反的方式,即如果B是我们不控制的类,则可以使用class A:public B {…};执行“子类化已知类”操作;并且我知道C ++没有相反的机制-“通过新类B超类化已知类A”。 我的问题是-最接近实现这种机制的逼近是什么?
注: - 这全部都是严格的编译时,而不是运行时。 - 对于class A来说,不能有任何更改。 我只能修改有关A和B的定义以及知道两者的代码。 其他人仍将使用class A,如果我想让我的代码与他们的交互,我也会使用它。 - 最好可以扩展到多个超类。 因此,也许我还有类C{protected:int x; double w; public:void baz();},它也应该像A的超类一样运行。
B类
更像是一个契约(contract),你可以在使用该库的代码中使用概念(concepts)/模板(templates)吗? - Zdeněk JelínekA
不是一个模板,所以你不能使用CRTP从它继承,而且它已经不从B
继承。 - Daniel HA
转换为B
,那么它是否会起作用? 如果是这样,在B
中,您可以编写一个隐式转换构造函数。 - Daniel HB
的内容成为模板,并像所有必需的成员都在那里一样运行。如果它们不存在,则编译将失败。 - Daniel H