假设我有以下类(class):class BaseObject { public: virtual int getSomeCommonProperty();};class Object1: public BaseObject { public: virtual int getSomeCommonProperty(); // optional int getSomeSpecificProperty();};class BaseCollection { public: virtual void someCommonTask();};class Collection1: public BaseCollection { public: virtual void someCommonTask(); // optional void someSpecificTask();};从BaseCollection派生的每个集合都处理一种特定的对象类型(并且只有一种类型)。但是,BaseCollection应该能够仅使用BaseObject中的公共(public)对象属性来执行所有对象共有的某些任务。目前,我可能会想到三种解决方案:1)将对象列表存储在BaseCollection中,例如:class BaseCollection { vector<BaseObject*> objects;};该解决方案的问题在于,当我需要在Collection1中执行特定于对象的任务时,我需要dynamic_cast ,因为我不想将虚拟继承用于特定属性,而仅将其应用于一种类型的对象。考虑到dynamic_cast 可能每秒可能被调用数百万次,对于性能关键型应用程序来说,这似乎是一个问题。2)将对象列表存储在Collection1中,例如:class Collection1: public BaseCollection { vector<Object1*> objects;}但是,然后我需要某种方法来访问BaseCollection中的此对象列表,以便能够对它们执行一些常见任务,最好是通过迭代器。我将需要创建一个为BaseCollection返回 vector 的函数,但是,这似乎并不十分有效,因为这样做的唯一方法是创建一个新 vector (可能包含数千个对象)。3)将对象列表存储在BaseCollection AND Collection1中:class BaseCollection { public: void someCommonTask(); // Use baseObjects virtual void addObject() = 0; protected: vector<BaseObject*> baseObjects;};class Collection1: public BaseCollection { vector<Object1*> objects; public: virtual void addObject() { Object1* obj = new Object1; objects.push_back(obj); baseObjects.push_back(obj); } void someSpecificTask(); // Use objects, no need of dynamic_cast<>}这两个列表实际上包含相同的对象。听起来像丑陋吗?我正在为这种类型的问题寻找正确/正确/最佳的设计模式,上面公开的3个解决方案中的任何一个都不令我满意。也许可以用模板来解决该问题,但是然后我看不到一种存储多态集合列表的方法,如下所示:vector<BaseCollection*> collections; (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我认为您应该选择选项1,但应使用静态转换。毕竟,派生的集合肯定知道成员变量的类型。 This answer很好地解释了这一点。 (adsbygoogle = window.adsbygoogle || []).push({}); 09-07 10:02