首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态对象外部多态调用函数

多态对象外部多态调用函数
EN

Stack Overflow用户
提问于 2014-03-03 12:24:35
回答 1查看 197关注 0票数 0

假设我有一堆存储类X1X2Xn

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

代码语言:javascript
复制
class Writer
{
public:
  void write(const X1& x);
  ...
  void write(const Xn& x);
};

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

代码语言:javascript
复制
class B;
class D1: public B;
class D2: public B;

初始化如下:

代码语言:javascript
复制
B* d1 = new D1();
B* d2 = new D2();

现在,我需要增强类编写器,以包含以下功能:

代码语言:javascript
复制
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是否可行,他们是否还有解决这个问题的其他建议?

备注

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-03 12:49:40

你应该可以通过双重调度来解决这个问题:

代码语言:javascript
复制
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); }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22146743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档