在多态对象之外多态调用函数

时间:2014-03-03 12:24:36

标签: c++ polymorphism

假设我有一堆存储类X1X2 ,,, Xn
假设我有Writer类,为每个存储类提供write()个函数:

class Writer
{
public:
  void write(const X1& x);
  ...
  void write(const Xn& x);
};

现在我必须添加更多存储类,如下所示:

class B;
class D1: public B;
class D2: public B;

初始化如下:

B* d1 = new D1();
B* d2 = new D2();

现在我需要增强类Writer以包含以下函数:

void write(const B* b);
void write(const D1* d);
void write(const D2* d);

但这不符合我的意图。调用write(d1)不会调用void write(const D1* d)。我失去了以多态方式调用write()的能力。

在我看来,这是visitor pattern的工作(如果我错了,请纠正我。我不是这种模式的经验,可能会弄错)。

无论visitor pattern是否可行,是否有其他建议可以解决这个问题?

注释

  1. Writer是一个复杂的类,它将存储类写入二进制文件。没有任何存储类需要知道它们被序列化到文件的方式。存储与写入过程分开。
  2. dynamic_cast是一个不经意的解决方案,但我想避免这种情况。它不干净,而且,如果我有很多派生类怎么办。

1 个答案:

答案 0 :(得分:2)

你应该能够通过双重调度解决这个问题:

class Writer
{
public:
    void write(const B* x)
    {
        x->on_write(*this);
    }

    void accept(const D1* x);
    void accept(const D2* x);
};

class B
{
public:
    virtual void on_write(Writer& x) = 0;
};

class D1 : public B
{
public:
    void on_write(Writer& x) override { x.accept(this); }
};

class D2 : public B
{
public:
    void on_write(Writer& x) override { x.accept(this); }
};