gpt4 book ai didi

c++ - 多态成员变量

转载 作者:行者123 更新时间:2023-11-28 00:52:17 25 4
gpt4 key购买 nike

昨天我关于 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。

关于c++ - 多态成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13474607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com