2017-08-15 3 views
0

をオーバーライド++C iはコード下記たベース部材値

class A 
{ 
public: 
    int foo = 0; 
}; 

class B: public A 
{ 
public: 
    int foo = 1; 
}; 

int main() 
{ 
    A *a = new B(); 

    std::cout << a->foo; 
    std::getchar(); 

    return 0; 
} 

を出力:0

理由BはAからメンバーFOOをオーバーライドしないのですか?

とどのよう

は、派生クラス

+0

を達成するために以下に変更します。それはそれを隠している。仮想フィールドを持つことはできないので、上書きはできません。 https://stackoverflow.com/questions/19290796/override-member-field-in-derived-classesを参照してください。あなたは関数を使うことができます。 –

答えて

1
#include <iostream> 
using namespace std; 

class A 
{ 
    int foo_ = 0; 
public: 
    virtual int foo() const { return foo_; } 
    virtual ~A(){} 
}; 

class B: public A 
{ 
    int foo_ = 1; 
public: 
    virtual int foo() const { return foo_; } 
}; 

int main() 
{ 
    A *a = new A(); 
    A *b = new B(); 

    cout << a->foo() << '\n'; 
    cout << b->foo() << '\n'; 
    cin.ignore(); 

    delete a; 
    delete b; 
} 

B::fooA::fooから完全に別個の部材です。そのため、B::fooの初期化ではA::fooが更新されません。代わりに、より多くのこのような何かをしなければならないでしょう:

class 
{ 
public: 
    int foo; 
    A(int value = 0) : foo(value) {} 
}; 

class B : public A 
{ 
public: 
    B() : A(1) {} 
}; 

int main() 
{ 
    A *a = new B(); 
    std::cout << a->foo; 
    delete a; 
    std::getchar(); 
    return 0; 
} 
3

することができますのみオーバーライドvirtualメンバー関数にキャストせずに1の所望の出力を取得します。
他のすべてのメンバ(関数、型またはメンバ変数)は、のみシャドウされたです。

これは、まったく変更されていないが、scope-resolution-operatorなどを使用して、適切なベースを参照することなく簡単にアクセスできないことを意味します。

したがって、メンバー変数の代わりに仮想関数を使用するように変更してください。

2

仮想関数を使用します。仮想フィールドを持つことはできませんので、インスタンスポインタ(A)のタイプの値であり、指しているものの真のタイプ(B)ではありません。

0

あなたはデータメンバーは直接ポリモーフィックにアクセスすることができないので、あなたのメンバ変数「foo」という仮想getterメソッドを書くことができます多型の挙動を使用したいと。

あなたのサンプル・コード・スニペットは、それがオーバーライドいないthat-

class A 
{ 
    int foo; 
public: 
    A() { foo = 0; } 
    virtual int getFoo() { return foo; } 
}; 

class B: public A 
{ 
    int foo; 
public: 
    B() { foo = 1; } 
    virtual int getFoo() { return foo; } 
}; 

int main() 
{ 
    A *a = new B(); 

    std::cout << a->getFoo(); 
    std::getchar(); 

    return 0; 
} 
関連する問題