【发布时间】:2025-11-25 12:20:03
【问题描述】:
我有一个基类BaseObject,以及两个派生类DerivedObject1 和DerivedObject2。它们共享一个共同的行为和方法,但DerivedObject1 有一个额外的方法。我的主类MyClass 存储(在std::vector)boost::shared_ptr 这些类的实例。 MyClass 需要为所有 BaseObject 调用 commonMethod(),有时为所有 DerivedObject1 调用 additionalMethod()。
class BaseObject
{
virtual void commonMethod();
}
Class DerivedObject1 : public BaseObject
{
void commonMethod();
void additionalMethod();
}
Class DerivedObject2 : public BaseObject
{
void commonMethod();
}
在MyClass 中有两个向量,一个存储DerivedObject1 和DerivedObject2 的所有指针,另一个只存储DerivedObject1 的指针有什么缺点吗?这意味着我将拥有所有 DerivedObject1 指针两次。但我认为至少对不同方法的调用是明确的。
class MyClass
{
typedef std::vector<std::shared_ptr<BaseObject>> BaseObjectVector;
typedef std::vector<std::shared_ptr<DerivedObject1>> DerivedObject1Vector;
BaseObjectVector everything;
DerivedObject1Vector only_derived1;
void doSomething()
{
for (BaseObjectVector::iterator iter = everything.begin(); iter != everything.end(); ++iter)
{
(*iter)->commonMethod();
}
}
void doSomethingForDerivedObject1()
{
for (DerivedObject1Vector::iterator iter = only_derived1.begin(); iter != only_derived1.end(); ++iter)
{
(*iter)->additionalMethod();
}
}
}
我可以想到其他方法来做到这一点,主要是为DerivedObject1 设置一个向量,为DerivedObject2 设置一个向量,但是要调用commonMethod(),我必须遍历这两个向量。我最初的解决方案对我来说似乎是最好的,除了一些指针被存储了两次。这样做有什么缺点?
【问题讨论】:
-
为什么 DerivedObject1 不能从 DerivedObject2 继承?那么问题不就消失了吗?
-
有什么理由不能将
additionalMethod()提升到基类中并使其成为DerivedObject2的无用函数? -
请向我们展示而不是描述您的代码。最好采用Minimal, Complete, and Verifiable Example 的形式。也请阅读how to ask good questions,以及this question checklist。
-
是的,抱歉,这是 boost::shared_ptr,将编辑,我在版本之间切换并感到困惑
-
Visitor pattern 可能是向基类添加新虚拟方法的替代方法。
标签: c++ shared-ptr c++03