是否有一个像样的选择,以动态_演员 我正在研究一个C++项目,并且面临一个当前的设计问题。如果有人能给我一些建议,我将不胜感激。基本上,我有一个基类base和一个子类派生如下。派生类可以执行类基类无法执行的操作 class Base { public: virtual bool IsCapableOfDoingA() {return false;} } class Derived: public Base { public: bool IsCapableOfDoingA() {return true;} void DoA(); }
在另一个地方,我有一个类Base类型的指针是否有一个像样的选择,以动态_演员 我正在研究一个C++项目,并且面临一个当前的设计问题。如果有人能给我一些建议,我将不胜感激。基本上,我有一个基类base和一个子类派生如下。派生类可以执行类基类无法执行的操作 class Base { public: virtual bool IsCapableOfDoingA() {return false;} } class Derived: public Base { public: bool IsCapableOfDoingA() {return true;} void DoA(); },c++,C++,在另一个地方,我有一个类Base类型的指针 void functionA(Base *pBase) { if (pBase && pBase->IsCapableOfDoingA()) { Derived *pDerived = static_cast<Derived*>(pBase); pDerived->DoA(); } } void函数(基本*pBase) { if(pBase&&pBase->IsCap
void functionA(Base *pBase)
{
if (pBase && pBase->IsCapableOfDoingA())
{
Derived *pDerived = static_cast<Derived*>(pBase);
pDerived->DoA();
}
}
void函数(基本*pBase)
{
if(pBase&&pBase->IsCapableOfDoingA())
{
派生*pDerived=静态转换(pBase);
p验证->DoA();
}
}
通常的方法是将函数添加到基类中
virtual void DoA() { throw std::runtime_error("Not implemented"); }
在您的设计中,
DoA
可以返回某种类型的成功代码吗?您可以将IsCapableOfDoingA
替换为DoA
本身,让基本版本只返回false(或其他合适的错误代码)。能够执行A
的子对象可以通过适当的实现重写此函数
你说得对,
dynamic\u cast
通常是一种设计味道。有了更多的背景,我们或许能够提供一个更好的答案。我的第一个想法是,如果要以多态方式向Base
s询问他们可能无法做的事情,那么要确保Derived
is-aBase
。如果对象没有适当的类型,dynamic\u cast将返回NULL(假设基类定义了至少一个虚拟方法——通常至少应该使基类的析构函数为虚拟的)
void functionA(Base *pBase)
{
if (Derived *pDerived = dynamic_cast<Derived*>(pBase)) {
pDerived->DoA();
}
}
void函数(基本*pBase)
{
if(派生*pDerived=dynamic_cast(pBase)){
p验证->DoA();
}
}
如果pBase没有派生类型,则pDerived将为0(false),因此将跳过If语句体。还有一个想法。您可以将增强的函数拆分为一个接口,并使用一个方法返回接口指针
class InterfaceA
{
public:
virtual ~InterfaceA() {}
virtual void DoA() = 0;
};
class Base
{
public:
virtual InterfaceA* GetAInterface() {return NULL;}
};
class Derived: public Base, InterfaceA
{
public:
InterfaceA* GetAInterface() {return this;}
void DoA();
};
void functionA(Base *pBase)
{
InterfaceA* pA = pBase ? pBase->GetAInterface() : NULL;
if (pA)
pA->DoA();
}
首先需要动态多态性的
Base
和Derived
您在做什么?如果没有上下文,就无法回答这个问题。在您的问题中,您要求提供dynamic\u cast
的替代方案,但它有什么问题吗?如果没有更多上下文,这是不可能回答的。但是,正如您所做的那样猜测一下,如果您需要查询存在哪些成员函数,那么几乎可以肯定您应该重新考虑您的设计。是我的印象还是应该是静态的(pBase)(带指针)?您可以创建一个公共的虚拟configure()
函数,并让每个子类决定如何最好地执行该操作?如果它涉及到执行A
,那么那些可以执行的子类将执行该操作。Base返回false是可以的,因为它不能执行A。但是,由于Base不能执行A,我正在考虑向Base提供此接口是否真的有意义。IIRC,这是设计问题讨论在C++中,作者给出了一个例子,即鸟可以飞或不能飞。所以最好不要为类鸟提供一个蝇类,而是推导一个具有蝇()成员方法的亚纲鸟,YEP,它是第三版的有效C++的第32条。史葛给出建议(作为其中之一)。但是没有绝对正确的答案。谢谢Mark的建议。在您的解决方案中不需要静态强制转换。这取决于-如果什么都不做是合理和常见的,我只需编写virtualvoiddoa(){}
。请注意,该问题在else
分支中不包含throw
。