2012-02-26 7 views
3

これはC++用です。関数の宣言を継承したクラスヘッダにコピー&ペーストする必要がある理由

通常、ヘッダファイルに関数宣言があり、ソースファイルに定義されています。

//< A.hpp 
class A 
{ 
public: 
    virtual funcA(); 
    virtual funcB(); 
} 

そして、我々はAからクラスを継承しており、その機能を無効にしたい: は、私たちはいくつかの機能を持つクラスAを持っていると言います。

//< childA.hpp 
class childA 
{ 
    virtual funcA(); 
    virtual funcB(); 
} 

我々はfuncA() funcB()の宣言を変更する毎回では、我々は、子クラスのヘッダファイルに新しい宣言をコピーアンドペーストする必要があります。継承チェーンが長い場合、それはかなり厄介です。

私はObject-Cにこの問題がないことを覚えていますか?ウィキペディアにObjective-Cの記事から

+1

なぜ** defintions **を子クラスのヘッダーファイルにコピーしますか?私はあなたが宣言を意味したと思う。子クラスが仮想関数を持っているならば、ソースファイルは実装を提供するでしょう。そうでなければ、基本クラスの仮想関数が呼び出されます。純粋な仮想メンバ関数ではないことを忘れないでください。 – Mahesh

+0

修正されました。定義の代わりに宣言する必要があります。混乱させて申し訳ありません。はい、宣言が親クラスで変更された場合、子クラスのソースファイルは異なる実装を持つ可能性があるため、変更する必要があります。しかし、親クラスのヘッダーファイルに同じコードを持つ子クラスのヘッダーファイルも変更する必要があります。 –

答えて

5

オーバーライドしない限り、メンバー関数の宣言を子クラスのヘッダーファイルにコピーする必要はありません。その場合、宣言する必要がある主な理由は、ヘッダーファイルを読んだ人に、その子クラスが別の実装を提供していることを知らせることだと思います。原則として、コンパイラは自動的にそれを把握することができますが、人が手動で同じことをするのは本当の苦痛かもしれません。

多くの場合、ヘッダーファイルを読んでいる人は、本体の実際のソースコードにアクセスできない場合があります(コンパイルされたオブジェクトとして配信される独自のライブラリなど)。体を見てそれを理解してください。

+0

ありがとうございますjjlin、これはやや妥当ですが、人々がソースコードにアクセスできる場合、どのメンバ関数がオーバーライドされているか知ることができるはずです。人々がヘッダーファイルだけを読み込んだ場合、宣言はまったく同じなので、子クラスが何をするかについてはまだ分かりません。 –

+0

私は実際にあなたの意見を編集してソースコードにアクセスすることについてあなたの意見を編集しましたが、あなたがあなたのコメントを投稿したときにそれを見たことはなかったでしょう。宣言がまったく同じであれば、コメントがまったく同じではないと願っています。 :) – jjlin

1

のObjective-Cは、Smalltalkのように、動的型を使用することができますオブジェクトは、そのインターフェイスで指定されていないメッセージを送信することができます。

http://en.wikipedia.org/wiki/Type_system#Dynamic_typing

C++、一方、は静的を入力です。より厳しいコンパイル時の制約です。

+0

ありがとうございますchroipahtz。あなたは正しいです、C++は純粋なOOではありません。私はしばらくの間C++を使っていましたが、以前はこの迷惑な点に気づいたことはありませんでした。私はそれを回避するためのトリック/パターンがあるかどうか疑問に思っています。 –

+0

実際、「純粋なオブジェクト指向」は動的または静的な型付けとは関係ありません。 「客観的なc」という名前があなたを欺くことを許さないようにしてください。 C++はオブジェクト指向言語の標準をかなり設定しています。 – chroipahtz

関連する問題