C ++虚函数和设计模式

时间:2015-04-02 17:42:14

标签: c++ design-patterns

我有一个Data类型的抽象基类和两个继承的类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;
    }
};

感谢您的建议。

更新

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

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

3 个答案:

答案 0 :(得分:2)

您需要在名为Data的{​​{1}}中添加纯虚拟方法。然后在updateData1中实施。面向对象编程的主要目标之一是将与之相关的数据和代码保存在一起:)。

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

您执行的操作取决于2种运行时类型 - 这是由Double dispatch机制处理的案例。您可能想查看访客模式。