2017-04-08 10 views
1

私は十二分に見てきましたが、::演算子に関するこれに関するリソースは見つかりませんでした。C++の継承 - "::" s、.hファイル、.cppファイルの使用を含む関数のオーバーライド

私は2つのクラス:ABを持っています。私も別のクラスを持っていますC

Bは、Aのように、Cから継承します。

Adと呼ばれる方法が含まれています

A.hファイル:

class A 
{ 
public: 
    ... 
    void d(); 
}; 

A.cppファイル:

... 
void A::d() 
{ 
    ... 
} 

私はBまたはCを持っている場合は、私はそれらを実行するdの場合、BまたはCに独自のオーバーライドdがない場合、このメソッドを実行する必要があります。

dBに上書きしたいのですが、これはどうやって行うのかはわかりません。私は、この内部B.cppファイル?:

void A::d() 
{ 
    ... 
} 

または

void B::d() 
{ 
    ... 
} 

をしてBでそれを宣言する "やってsの.hファイルされるべきか?

また、機能がvirtualである必要がありますか?

+5

それは良い[C++の本](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)の時間だそうです。 –

+1

関数を仮想化します。 Aが抽象的であれば、それをプライベート仮想にする。サブクラスでoverrideキーワードを使用して関数をオーバーライドします。 C++では、関数は仮想でなければならず、Javaのような自動呼び出しはありません。 –

+0

@ 4386427:これは「スコープ解決演算子」です。 –

答えて

4

オーバーライドは、仮想メンバ関数のプロパティであり、クラス定義の一部です。

を模式的に、あなたがしたい:

struct A 
{ 
    virtual void d() { /* A's implementation */ } 
}; 

struct B : A 
{ 
    void d() override { /* B's override of A::d */ } 
}; 

struct C : A 
{ 
}: 

使用法:あなたはこの機能があるとします。

その後
void g(A & a) { a.d(); } 

B b; 
g(b); // calls b's B::d 

C c; 
g(c); // calls c's A::d on the A-subobject of c 

を(あなたは別のファイルにコードを分割する方法があります継承とオーバーライドとは関係ありません)

+0

'A :: d()'が 'virtual'としてマークされていない場合、この動作がどのように変化するかに関する情報を追加することを検討してください。 – alexeykuzmin0

関連する問題