考虑这个例子。
我有一个容器类 ( A),它重载/实现了各种算术运算符 ( A::negate())。
我现在希望创建派生类(B和C)。
B并且C应该由A.
但是,这些运算符应该使用派生类对象作为参数。
的原型B::negate应该是:B B::negate(),而不是A B::negate()。
派生类不需要任何自己的字段,但可以实现自己的方法(B::foo(), C::bar())。B和不兼容是一个要求C,即B不能将对象分配给C对象,也不能与任何C's 运算符一起使用。
这是示例代码,我希望它如何工作:
struct A {
int val;
A negate() {
return A{-val};
}
};
struct B: A {void foo(){}};
struct C: A {void bar(){}};
int main() {
B obj0 = {5};
B obj1 = obj0.negate();
}
我知道使用标准继承这可能是不可能的,并且可能是 C++11 根本无法做到的,所以我要求尽可能接近它的东西。
我提出的目前最好的解决方案是根本不使用继承,而是在基类中添加一个整数模板参数,将派生类定义为using B = A<1>;, using C = A<2>;,并仅为某些特化(仅A::foo<1>(){}和A::bar<2>(){})实现成员方法。
但是,我对这个解决方案非常不满意。