2011-08-22 9 views
2

継承とは別の理由として、クラスがその機能を仮想として持つ必要がある場合はどうなりますか?cpp継承に関する質問

実行時に、基本クラスが継承され、派生クラスが基本クラス関数をほとんど実装せず、3番目のクラスが、仮想クラスとして定義されている未定義メソッドを呼び出します。 seg faultまたはそれは基本クラス関数を呼び出すか?

派生クラスのベースクラスのすべての関数を定義したくなくても、必要な継承を引き続き実行したい場合はどうすればよいですか?

答えて

3

クラスは継承とは別に、 の機能を仮想として持つ必要がありますか?

継承を扱っていない場合、virtual機能を使用するための合理的な使用法はありません。どちらもお互いに意味があります。基底クラスが継承され、 派生クラスが基底クラスの機能と 第三のクラスのいくつか実装していない場合に、実行時に何が起こる

を呼び出し、そのベースに仮想 のように定義されている未定義のメソッド。 seg faultまたはそれは基本クラス関数を呼び出すか?派生クラスであれば

virtual関数が派生クラスのオブジェクトで呼び出され、その後(即時)基底クラス、その本体には全くvirtual機能についての宣言をしません。一方、派生クラスでvirtual関数を宣言しても、それを定義していない場合は、リンカーエラーです。セグメンテーション違反はありません。

私は私の派生クラスに私 基本クラスのすべての関数を定義したいが、まだ場所で必要な 継承を持っていない場合、私は何をすべき?

これは明らかではありませんが、派生クラスでvirtual関数を宣言/定義していないといいでしょう。基本クラスvirtual関数を使用します。

+0

あなたが答えた最後の質問に関しては、それらが内部で実行されるだけの機能であって、それらを非公開にすると、それらが継承されないようにするでしょうか? – Rhexis

+0

@Flyphe、no。アクセス指定子は、継承される(つまり、オーバーライドされる)機能を禁止することはできません。それでも無視することはできます。内部的に関数が(派生クラスオブジェクトで)呼び出された場合でも、それはまだオーバーライドされた関数に解決されます。 [デモを見る](http://www.ideone.com/3XmWL) – iammilind

+0

プライベートな変数と関数は継承できますか?それから、保護していたポイントは何ですか? – Rhexis

0

virtualメソッドを再実装しないと、呼び出し元は基本クラス1を呼び出します。これは、継承を使用するポイントの一種です、IMO。

あなたは仮想メソッドを実装する基本クラスをしたくない場合は、このようにそれを宣言することができます。

class Demo { 
    void foo() = 0; 
}; 

これは抽象クラスと呼ばれるものです。 このようなクラスのインスタンスを作成することはできません。 Demoから継承するすべてのクラスは、foo()を実装する必要があります。また、抽象クラスでもあり、インスタンス化することはできません。

関連する問題