C++虚拟功能与设计模式

C++ virtual function and design pattern

本文关键字:设计模式 功能 虚拟 C++      更新时间:2023-10-16

我有一个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;
    }
};

谢谢你的建议。

更新:

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

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

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

使用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类似。

您执行的操作取决于两种运行时类型-这是由Double调度机制处理的情况。您可能想要查看Visitor模式。