考虑这个例子。
我有一个容器类 ( 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>(){}
)实现成员方法。
但是,我对这个解决方案非常不满意。