gpt4 book ai didi

c++ - 在多态对象之外多态地调用函数

转载 作者:行者123 更新时间:2023-11-28 02:55:16 25 4
gpt4 key购买 nike

假设我有一堆存储类 X1,X2,,,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 是一个不经意的解决方案,但我想避免这种情况。它不干净,此外,如果我有很多派生类怎么办。

最佳答案

你应该能够通过双重分派(dispatch)来解决这个问题:

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); }
};

关于c++ - 在多态对象之外多态地调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22146743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com