c++ - 如何通过基类指针获取子类的属性

标签 c++ class inheritance subclass virtual

我有一个问题,我以类似的方式一次又一次遇到。

例如:

我有一个抽象基类,它充当一系列具体类的接口(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/

相关文章:

c++ - Rcpp 函数比相同的 R 函数慢

c++ - Jsoncpp 没有正确读取指数

CSS ID 与类

c++ - 使用派生类自动转换

java - Java Generic Type 参数可以扩展另一个 Type 参数和附加的有界类型吗?

c++ - C++中的双重继承运行时错误

java - 将 opengl 纹理句柄从 Android Java 传递到 C++?

c++ - 如何用C++扩展TCL?

php - 调用另一个类中的函数的两种方式有什么不同吗?

c++ - 继承方法,派生方法不调用基类