昨天,对于有关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。

08-04 19:13