2012-06-29 9 views
11

ここでC++でのポイントを理解しようとしています。 クラスAに非仮想メソッドがあり、クラスAがAを継承し、そのメソッドをオーバーライドする場合は、Bのインスタンスを作成して何らかの方法でBで定義されたメソッドを使用できますか? 非仮想メソッドを上書きするポイントがありますか?非仮想メソッドをオーバーライドするメソッドを使用できますか?

+1

あなたが記述しているものは*隠蔽*と呼ばれ、上書きされません。ここで見てください:http://stackoverflow.com/questions/2161462/c-inheritance-and-functionoverive – jrok

答えて

31

非仮想メソッドを上書きするポイントがありますか?

ので

すなわち、
B* b = new B(); 
A* a = new B(); 
b->method(); //Calls B's method 
a->method(); // Calls A's method 

をあなたが実際に上書きされていないが、これは動作で、ポインタ/参照型と呼ばれる方法を決定します。

私はBのインスタンスを作成して、何らかの形でBで定義されたメソッドを使用できますか?

はい。ポインタ/参照型はB型でなければなりません(前の例を参照)。

あなたがvirtualするmethodを宣言しない場合、あなたはオーバーライドが、それはできませんが、あなたはにそれを隠すことができます。

+0

偉大な答え、ありがとう – Eyal

+1

'A 'は' virtualメソッド() 'を宣言するいくつかの基本クラスから派生した(またはインターフェイスを実装する)状況で、' a->メソッド() 'は実際には' B.method() 'を呼び出すでしょう... – BadCash

+0

@Chipあなたはその違いを強調するのを忘れました。この回答はBadCashsのコメントでのみ完了します。 – ManuelSchneid3r

9

BもしAから継承し、Aで定義されたメソッドを再定義し、その後、Bの新しいインスタンスがBのバージョンを呼び出します。しかし、メソッドが仮想でない場合は、多態的な振舞いはないので、BのインスタンスがAとして参照されている場合、メソッドはAになります。例えば:

struct A { 
    void foo() { std::cout << "A::foo" << std::endl; } 
}; 

struct B : public A { 
    void foo() { std::cout << "B::foo" << std::endl; } 
}; 

B b; 
b.foo(); 
A *a = &b; 
a->foo(); 

は、上記のコードの出力は次のようになりますfoo方法が仮想であった場合は、次にB::fooは二回印刷されたであろう

B::foo 
A::foo 

+0

よく書かれています! : – niknak

2

機能がvirtualない場合、変数の型があまりにも送出される実装決定:

#include <iostream> 

using namespace std; 

struct A { 
    void f() { cout << "A" << endl; } 
}; 

struct B : public A { 
    void f() { cout << "B" << endl; } 
}; 

int main(int args, char** argv) { 

    B b; 
    A& a = b; 

    b.f(); 
    a.f(); 

    return 0; 
} 
0
  • いいえ、クラスAの非仮想メソッドをオーバーライドするための機構がない
  • はい、スコープ解決演算子Aを使用してBにオーバーロードクラスAから非仮想メソッドを使用することができ:: methodNameの
関連する問題