Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一个像样的选择,以动态_演员 我正在研究一个C++项目,并且面临一个当前的设计问题。如果有人能给我一些建议,我将不胜感激。基本上,我有一个基类base和一个子类派生如下。派生类可以执行类基类无法执行的操作 class Base { public: virtual bool IsCapableOfDoingA() {return false;} } class Derived: public Base { public: bool IsCapableOfDoingA() {return true;} void DoA(); }_C++ - Fatal编程技术网

是否有一个像样的选择,以动态_演员 我正在研究一个C++项目,并且面临一个当前的设计问题。如果有人能给我一些建议,我将不胜感激。基本上,我有一个基类base和一个子类派生如下。派生类可以执行类基类无法执行的操作 class Base { public: virtual bool IsCapableOfDoingA() {return false;} } class Derived: public Base { public: bool IsCapableOfDoingA() {return true;} void DoA(); }

是否有一个像样的选择,以动态_演员 我正在研究一个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

在另一个地方,我有一个类Base类型的指针

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-a
Base

如果对象没有适当的类型,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