两个折叠的多态是很奇怪的,如何让它可扩展?

时间:2016-07-09 02:04:33

标签: c++ templates c++11 virtual-method

例如,我有一个抽象基类ABA有一个虚拟方法如下

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 ++功能。

1 个答案:

答案 0 :(得分:1)

不幸的是,在C ++中没有虚拟模板功能(在解析你的问题后,我认为这是你想要完成的)。

我能想到的最接近,最难看的解决方案是让基类B中的虚函数将基类A作为参数:

class B
{
public:
    virtual void f(A& a) = 0;
};

B1会覆盖该内容,然后使用dynamic_cast将其参数强制转换为A1的实例。

通过这种方式,您可以继续定义每个AxBx对派生类,而无需在两个层次结构之间更改基类中的API接口。

有点难看,但问题是“可以使用任何C ++功能”,而dynamic_cast肯定符合该要求。