2011-12-30 7 views
0

親クラスからメソッドを継承するときに、ヘッダーファイルに関数を宣言する必要があるときを理解しようとしています。適切なヘッダーファイルの構文

class parent{ 
public: 
    virtual void foo()= 0; 
} 

は私が親から継承した子クラスを考えてみましょう私も子供のヘッダファイルにFOOを宣言しなければならないのか、私は単純にメソッドを定義することができます。たとえば

は、私は以下のクラスを持って言うことができます子供のためのソースファイルに?

以下の記載が間違っていますか?

HEADERFILE:

class child : public parent{ 
} 

クラスファイル:

child::foo(){ 
// do something 
} 
+0

'foo'は' virtual'と宣言する必要があります。それとは別に 'foo'をオーバーライドしている場合(それは純粋な仮想であるため、あなたはすべてを必要とします)、クラス定義の一部として子クラスで宣言する必要があります。 – cHao

+0

'foo()'も 'public'と宣言しなければなりません。さもなければ' parent'から継承したクラスにはアクセスできません。 –

+0

C++は実際にはプライベート仮想関数を許可します(さらにそれらをオーバーライドすることもできます)。通常は、派生クラスに、インタフェースの一部となることなく、ベースクラスが期待するいくつかの機能を指定できるようにすることです。 – cHao

答えて

0

foo()を子のクラス定義またはそのヘッダーに宣言する必要はありません。それは自動的に継承されます - それが継承の意味です。 (もちろん、関数が基底クラス(parent)でpublicいうよりprivateなければならないであろうが、それはマイナーなpeccadilloです。)

あなたは単に子クラスのソースファイルにメソッドを定義します。

+0

これは当てはまりません。非純粋な仮想として宣言しない限り、彼は「子供」をインスタンス化することはできません。 – Puppy

+0

g ++に失敗しました: 'error:no 'void child :: foo()'メンバー関数が 'child'クラスで宣言されました。 – user666412

0

ヘッダファイル:

class Class : public Parent { 

public: 
    void myMethod(); 
} 

ソースファイル:

void Class::myMethod(){ 

} 
1

基本クラスの非仮想メソッドは子クラスに継承されるため、子クラスでそれらを定義したり宣言したりする必要はありません。派生クラスオブジェクトで呼び出される非仮想メソッドは、単に

派生クラスでメソッドを再度宣言すると、派生クラスで新しいメソッドが宣言されます。は、同じ名前を持つすべての基本クラスメソッドを隠蔽します。これはファンクション非表示と呼ばれます。

グッド読む:あなたが子供のクラスで再び基底クラスのメソッドを宣言する必要はありません仮想メソッドの場合

What's the meaning of, Warning: Derived::f(char) hides Base::f(double)?

、あなただけの定義を提供する必要があります。これはファンクションオーバーデッドと呼ばれます。

関連する問題