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

オブジェクトtの型が pointer-to-BaseBase、メンバーが定義されていないため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です。そのクラスにはメンバーがありません。Deriv*この方法でメンバーにアクセスするには、ポインタを a にキャストする必要があります。とにかく基本クラスへの型のポインターを作成するのはなぜですか? これは通常、ポリモーフィックなクラス階層がある場合にのみ役立ちます。

仮想関数を使用してこのメ​​ンバーの値を返すことを検討することもできますが、クラスとコードが何を達成しようとしているのかを知らなければ、いずれかの方法を推奨することは困難です。あなたの小さなコードサンプルに基づいて、単に

Deriv *t = new Deriv(2);

代わりに、より良い選択のようです

于 2012-12-01T12:48:40.980 に答える