ここでC++でのポイントを理解しようとしています。 クラスAに非仮想メソッドがあり、クラスAがAを継承し、そのメソッドをオーバーライドする場合は、Bのインスタンスを作成して何らかの方法でBで定義されたメソッドを使用できますか? 非仮想メソッドを上書きするポイントがありますか?非仮想メソッドをオーバーライドするメソッドを使用できますか?
答えて
非仮想メソッドを上書きするポイントがありますか?
ので
すなわち、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
を宣言しない場合、あなたはオーバーライドが、それはできませんが、あなたはにそれを隠すことができます。
偉大な答え、ありがとう – Eyal
'A 'は' virtualメソッド() 'を宣言するいくつかの基本クラスから派生した(またはインターフェイスを実装する)状況で、' a->メソッド() 'は実際には' B.method() 'を呼び出すでしょう... – BadCash
@Chipあなたはその違いを強調するのを忘れました。この回答はBadCashsのコメントでのみ完了します。 – ManuelSchneid3r
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
。
よく書かれています! : – niknak
機能が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;
}
- いいえ、クラスAの非仮想メソッドをオーバーライドするための機構がない
- はい、スコープ解決演算子Aを使用してBにオーバーロードクラスAから非仮想メソッドを使用することができ:: methodNameの
- 1. PyGObjectの仮想メソッドをオーバーライド
- 2. GmockでCppの別の非仮想メソッドで非仮想メソッドをモック
- 3. 仮想静的メソッドを使用できますか? (C++)
- 4. C++での仮想メソッドのオーバーライド
- 5. C#でクラスをオーバーライドし、オーバーライドメソッドを使用する仮想メソッドにアクセスする
- 6. Objective-Cの非仮想メソッド
- 7. ASP.NET:コンパイルされたアセンブリから非仮想メソッドをオーバーライドする方法
- 8. パブリック非仮想メソッドへのパッチ適用
- 9. メソッドをオーバーライドするとき、仮想キーワードはどういう意味ですか?
- 10. リフレクションを使用した非仮想メソッド呼び出し
- 11. C#での仮想メソッドの使用
- 12. C#のメソッドは、別のメソッドをオーバーライドして同時に仮想化できますか?
- 13. WCF仮想メソッド
- 14. 仮想メソッド
- 15. C++仮想メソッド
- 16. .NETの非仮想メソッドの模擬/スタブ
- 17. C++初期化非仮想メソッド
- 18. 純粋仮想メソッドと仮想メソッドを混在させたクラス
- 19. 抽象メソッドまたは仮想メソッド?
- 20. C++の仮想デストラクタから仮想メソッドを呼び出す
- 21. リアルタイムでC#の仮想メソッドと新しいメソッドをオーバーライドする方法は何ですか?
- 22. 仮想拡張メソッド?
- 23. 抽象メソッドは仮想ですか?
- 24. 非仮想メソッドとC関数をモックすることができるC++モックフレーム
- 25. 非仮想メソッドをモックする方法は?
- 26. 非仮想文字列プロパティをオーバーライド
- 27. C#で抽象メソッドと仮想メソッドを作成する目的
- 28. C++でオーバーライドされた親仮想メソッドにアクセス
- 29. 仮想継承cantを使用する兄弟メソッド
- 30. 仮想継承に非仮想基本メソッドを呼び出す追加コストはありますか?
あなたが記述しているものは*隠蔽*と呼ばれ、上書きされません。ここで見てください:http://stackoverflow.com/questions/2161462/c-inheritance-and-functionoverive – jrok