我有一个问题,我以类似的方式一次又一次遇到。
例如:
我有一个抽象基类,它充当一系列具体类的接口(interface),这些具体类充当数据容器。
class DataInterface
{
public:
DataInterface();
~DataInterface();
virtual void FetchData(void) = 0;
virtual void ProcessData(void) = 0;
virtual void ClearData(void) = 0;
}
具体的类如下所示:
class BinaryData: public DataInterface
{
public:
BinaryData();
~ BinaryData();
virtual void FetchData(void);
virtual void ProcessData(void);
virtual void ClearData(void);
private:
bool m_boolData;
}
class IntegerData: public DataInterface
{
public:
IntegerData();
~ IntegerData();
virtual void FetchData(void);
virtual void ProcessData(void);
virtual void ClearData(void);
private:
int m_intData;
}
子类实现了从DataInterface继承的接口(interface)。但它们有不同的属性来保存数据。到目前为止一切顺利。
我可以像这样使用主函数中的类:
int main()
{
int IntegerData;
bool BoolData;
DataInterface *pData1 = new BinaryData();
DataInterface *pData2 = new IntegerData();
pData1->FetchData();
pData2->FetchData();
pData1->ProcessData();
pData2->ProcessData();
// now I want to get the data of pData1 and pData2, for example to write it into a file, show in visualization, ...
IntegerData = pData2->GetData() ????
BoolData = pData1->GetData() ????
}
现在问题来了:
如何从具体类中获取数据?我只有基类指针,因此我需要在 DataInterface 中定义一个抽象 getter 方法。但是 getter 方法的签名因子类而异。例如,一次我需要返回一个整数,一次我需要返回一个 bool 类型。
请给我一个提示,这个问题让我发疯:/
最佳答案
在每个派生类上创建一个非虚拟 GetData()
成员。然后,如果您确定对象的实际类,则可以简单地执行静态转换并调用 GetData()
:
int intData = static_cast<IntegerData*>(pData2)->GetData();
如果您不知道该类,那么您需要执行动态转换并检查其结果:
if (IntegerData* _pData2 = dynamic_cast<IntegerData*>(pData2))
{
int intData = _pData2->GetData();
// Do stuff with the int
}
else if (BinaryData* _pData2 = dynamic_cast<BinaryData*>(pData2))
{
bool binaryData = _pData2->GetData();
// Do stuff with the bool
}
关于c++ - 如何通过基类指针获取子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15708814/