2016-12-02 19 views
-1

派生クラスで仮想関数の名前を付ける方法を決定しようとしています。 派生クラスの名前の仮想関数

Base.h 
class Base 
{ 
public: 
    virtual void Virtual() = 0; 
}; 

Derived.h 
class Derived : public Base { 
public: 
    void Virtual(); 
}; 

Derived.cpp 
Derived::Virtual() // or Base::Virtual 
{ 
    cout << "Derived Virtual.\n"; 
} 

は私が派生::バーチャルまたはベース::実装ファイル内の仮想使用して行くのいずれかの方法で問題は何ですか?

+1

'Derived'の関数を定義するときに' Base :: 'が必要なのはなぜですか? – NathanOliver

答えて

1

これは達成したいことによって異なります。

Derived::Virtualはオーバーライドされた関数を定義し、Base::Virtualは基本クラスの関数を定義します。どちらもできます。前者を定義することをスキップすることはできません。すなわち、Derived::Virtualは純粋な仮想ではないため、定義していないときに呼び出されるとリンクエラーになることがあります。

それはいくつかの一般的な動作を提供するためにBase::Virtualを定義し、このように完全にそれを修飾することによって、仮想ディスパッチを使用せずに、その関数を呼び出しても意味がありません:

void Derived::Virtual() { 
    Base::Virtual(); 
    std::cout << Derived::Virtual() < "\n"; 
} 

は、参考のためにC++ pure virtual function have bodyDoes it make any sense to define "pure" virtual functions in the base class itself?を参照してください。

+2

プログラマーが簡単に呼び出しを忘れることができ、コンパイラーが気付かずに不思議なランタイム・バグが発生するため、これはまったくアンチパターンです。より良いアプローチは、**共通の非仮想**関数を持つことです。この関数は共通の振る舞いを持ち、**派生クラスに実装される**プライベートの純粋な仮想**関数を呼び出します。 –

+0

@ChristianHackl右のテンプレートメソッドです。私は実際にこのように見ていないが、それを完全に修飾して純粋な仮想関数を呼び出すという共通の慣例を引用しただけである。このC++機能の実際の使用例は何ですか? – iksemyonov

関連する問題