【问题标题】:C++ virtual function and design patternC++虚函数和设计模式
【发布时间】:2015-04-02 17:42:13
【问题描述】:

我有一个数据类型的抽象基类和两个继承类,Data1 和 Data2。 Data1 和 Data2 有不同的成员。我有一个对这些数据进行操作的抽象类 Proc。 Proc 有一个虚函数更新,它将 Data 的引用作为参数。 Proc1 和 Proc2 都定义了自己的实现。然而,这两个实现都将使用具体类 Data1 和 Data2 中定义的成员。鉴于参数是数据的参考,如何使这项工作?例如。

class Data {};
class Data1: public Data{
    int x;
};
class Data2: public Data{
    string str;
};

class Proc{
    virtual void update(const Data&) = 0;
};

class Proc1: public Proc{
    update(const Data &d){
         // this does not work
         cout << x << endl;
    }
};

class Proc2: public Proc{
    update(const Data &d){
         // this does not work
         cout << str << endl;
    }
};

感谢您的建议。

更新:

也许我的问题是,为了派生类几乎没有共同点(概念上除外)的多态性而定义抽象基类型 Data 并不总是一个好主意。 将来扩展处理新的具体数据类型的 Proc 类可能会更容易?

我的 proc 类实际上充当了 Data 的容器,它是 Id 和 deque 的映射。如您所见,在 Data 内部提供虚拟更新功能并不是一个好的解决方案。因为更新与 Proc 更相关(计算确实基于具体的数据类型)。

【问题讨论】:

  • 不相关的注释,基本类型应该有虚拟析构函数,几乎总是。
  • @MooingDuck 谢谢,代码仅用于说明目的
  • 如果你想使用一个基类,那么定义一些将在子类中实现的功能。否则,拥有基类是没有意义的。具有具体派生类的抽象基类是多态性的核心,但是多态性意味着利用所有子类中通用的功能(在声明级别而不是实现级别很常见)。
  • 唯一的问题是看到是“不起作用”。根据我正在查看的内容,它无法编译。但我感觉你想要更多。请参阅有关多态性和访问者的其他帖子。两者都可以克服你的编译器错误

标签: c++ design-patterns


【解决方案1】:

您需要在Data 中放置一个名为update 的纯虚方法。然后在Data1Data2 中实现它。面向对象编程的主要目标之一是将与之相关的数据和代码保持在一起:)。

【讨论】:

  • 我更新了详细信息。如果具体更新需要数据没有但包含在 Proc 类中的信息怎么办?
  • @bbc:那么Proc 类必须将其传递给update 函数。还有其他方法,但它们既复杂又丑陋。
【解决方案2】:

使用dynamic_cast 应该可以完成这项工作。

class Proc1 : public Proc {
    void update(const Data &d) {
       Data1 const* data1Ptr = dynamic_cast<Data1 const*>(&d);
       assert(data1Ptr != NULL);
       // Now use data1Ptr
    }
};

Proc2 也是如此。

【讨论】:

  • 这可行,但更好的解决方案可能是修复他无意义的设计模式
  • @dwcanillas 我知道这是一个糟糕的设计。这个的正常设计是什么?谢谢!
  • @dwcanillas,并不总是可以避免沮丧。 OP 可能对他的课程提出了简单的看法。
  • @bbc 如果没有更多细节,很难说好的设计是什么。仅就我们这里的信息而言,Adam 的解决方案似乎是一个不错的解决方案。
【解决方案3】:

您执行的操作取决于 2 种运行时类型 - 这是由 Double dispatch 机制处理的情况。您可能需要查看访问者模式。

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 2011-09-22
    • 1970-01-01
    • 2010-11-01
    • 2011-10-31
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多