昨天,对于有关polymorphic object members的问题,我得到了一个很好的答案。
但是现在我面临的问题是,该变量实际上并没有按照我期望的方式运行。使用以下代码:
#include <iostream>
#include <math.h>
using std::cin;
using std::cout;
using std::endl;
class Com
{
public:
virtual void setReady()
{
cout << "Com" << endl;
}
};
class DerivedCom : public Com
{
public:
void setReady()
{
cout << "DCom" << endl;
}
void somethingElse()
{
cout << "else" << endl;
}
};
class BaseClass
{
public:
Com* com;
public:
BaseClass(Com* c = new Com) : com(c)
{
}
virtual void setReady()
{
com->setReady();
}
};
class DerivedClass : public BaseClass
{
// the call to somethingElse() won't compile if I leave out this declaration
protected:
DerivedCom* com;
public:
DerivedClass() : BaseClass(new DerivedCom)
{
}
void setReady()
{
// This line causes a segfault if I put in the declaration earlier
this->com->setReady();
// This line won't compile if I leave out the declaration earlier
this->com->somethingElse();
}
};
int main()
{
DerivedClass* inst = new DerivedClass();
inst->setReady();
return 0;
}
问题是
DerivedClass::com
实际上是DerivedCom
类型,但是由于编译器找不到它们,因此我无法访问任何DerivedCom
特定的方法。如果输入额外的重新声明DerivedCom* com
,编译器将找到方法,但会出现分段错误。 最佳答案
删除该多余的声明。
如果确定Com*
是DerivedCom*
,则可以static_cast
它。
static_cast<DerivedCom*>(this->com)->somethingElse();
如果您错了,这可能会崩溃。因此,如果不确定,则可以
dynamic_cast
DerivedCom* dcom = dynamic_cast<DerivedCom*>(this->com);
if (dcom)
dcom->somethingElse();
如果对象不是您要求的类型,则
dynamic_cast
将返回NULL。