例如,我有一个抽象基类A
和B
。 A
有一个虚拟方法如下
class A
{
public:
virutal void f(B& b) = 0;
};
对于A1级
class A1 : public A
{
public:
void f(B& b) override { b.f(A1); }
};
因此对于B
,它需要一个虚拟方法f(A1)
class B
{
public:
virtual void f(A1& a) = 0;
};
在class B1 : public B
中,实现了虚拟方法。问题是,当添加另一个class A2 : public A
时,我必须在类virtual void f(A2& a) = 0
中添加一个虚拟方法B
,我认为这会破坏代码,因为我不知道是否{{在我设计课程A2
时添加或不添加偶数A1
。如何避免它但实现等效要求?即使使用模板,也可以使用任何C ++功能。
答案 0 :(得分:1)
不幸的是,在C ++中没有虚拟模板功能(在解析你的问题后,我认为这是你想要完成的)。
我能想到的最接近,最难看的解决方案是让基类B
中的虚函数将基类A
作为参数:
class B
{
public:
virtual void f(A& a) = 0;
};
B1
会覆盖该内容,然后使用dynamic_cast
将其参数强制转换为A1
的实例。
通过这种方式,您可以继续定义每个Ax
和Bx
对派生类,而无需在两个层次结构之间更改基类中的API接口。
有点难看,但问题是“可以使用任何C ++功能”,而dynamic_cast
肯定符合该要求。