1

我有以下程序:

#include <iostream>

class Base {};

class Deriv : public Base
{
    public:
        int data;
        Deriv(int data): data(data) {} 
};

int main()
{
    Base *t = new Deriv(2);
    std::cout << t->data << std::endl;
}

当我编译它时,我得到了错误:

x.cpp: In function ‘int main()’:
x.cpp:15:21: error: ‘class Base’ has no member named ‘data’

如何访问数据字段(请注意,我不想使用 Deriv *t = new Deriv(2))?

4

3 回答 3

5

把它放到基类:

virtual int get_data() const=0;

然后派生类将需要实现它 - 所有派生类的所有数据都将通过接口:

class Base
{
    virtual int get_data() const = 0;
};

class Deriv: public Base
{
public:
    int data;
    Deriv(int data): data(data) {} 
    virtual int get_data() const
    { return data; }
};
于 2012-12-01T12:49:25.413 回答
2

Objectt的类型为 pointer-to-Base并且Base没有定义data成员,这就是您的代码无法编译的原因。如果您确定它t指向一个实际的类型对象Deriv(就像您发布的代码一样),您可以强制转换它以便能够调用Deriv成员:

Deriv* d = static_cast<Deriv*>(t);
std::cout << d->data << std::endl;

如果您不知道t指向 type 的实际对象,Deriv则需要通过 dynamic_cast 对其进行多态向下转换并检查返回值:

Deriv* d = dynamic_cast<Deriv*>(t);
if (d != nullptr)
{
    std::cout << d->data << std::endl;
}

无论如何,根据您发布的代码,t如果Base*您只是使用它来访问仅由Deriv.

于 2012-12-01T12:55:17.433 回答
1

您已将指针声明为类型并且编译器是正确的,该类Base中没有成员。data您需要将指针重新转换为 aDeriv*以便以这种方式访问​​成员。你为什么要把类型指针指向基类呢?这通常仅在您具有多态类层次结构时才有用。

您可以考虑使用虚函数来返回此成员的值,但是在不知道您的类和代码试图实现什么的情况下,很难推荐一种方法或另一种方法。根据您的小代码示例,只需使用

Deriv *t = new Deriv(2);

相反,似乎是更好的选择

于 2012-12-01T12:48:40.980 回答