二折多态性很奇怪,如何使其可扩展?

Two folded polymorphism is weird, how to make it extensible?

比如我有一个抽象基classABA有一个虚方法如下

class A
{
public:
    virutal void f(B& b) = 0;
};

对于class 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 时,我必须在 class B 中添加一个虚拟方法 virtual void f(A2& a) = 0,我认为这破坏了代码,因为我没有知道我设计class B的时候加不加A2甚至A1。如何避免它但执行等效要求?任何 C++ 功能都可以与模板一起使用。

不幸的是,在 C++ 中没有虚拟模板函数这样的东西(这是我相信你在解析你的问题后试图完成的)。

我能想到的最接近、最不丑陋的解决方案是让基classB中的虚函数将基classA作为一个参数:

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

B1 覆盖它,然后使用 dynamic_cast 将其参数转换为 A1.

的实例

以这种方式,您可以继续定义每个 AxBx 派生的 class 对,而无需更改基础中的 API 接口class,在两个层级之间。

有点难看,但问题表明 "any C++ feature can be used",并且 dynamic_cast 当然符合该要求。