foo
がクラスD
で宣言され、バーチャルマークされていない場合、の動的タイプにかかわらず、foo
の実装をD
と呼びます。C++では、仮想関数をオーバーライドすると自動的に仮想関数ですか?
D& d = ...;
d.foo();
ただし、次のプログラムではそうではありません。誰もこれを説明できますか?メソッドが仮想関数をオーバーライドすると自動的に仮想メソッドですか?
#include <iostream>
using namespace std;
class C {
public:
virtual void foo() { cout << "C" << endl; }
};
class D : public C {
public:
void foo() { cout << "D" << endl; }
};
class E : public D {
public:
void foo() { cout << "E" << endl; }
};
int main(int argc, char **argv)
{
E& e = *new E;
D& d = *static_cast<D*>(&e);
d.foo();
return 0;
}
上記のプログラムの出力は次のようになります。
E
はstatic_castは不要である - 'D&D = * static_castを(&e);' D&D = E 'と等価である。 '起因&D *にE */Eから暗黙キャストします/ D&。 –
C++ 11で関数宣言に "override"を追加すると、基本クラス関数をオーバーライドする意図が明確になります。また、宣言した関数のbaseがconstと異なる場合(コンパイラからエラーがトリガされます)例えば、std :: exceptionから派生し、what()non-const)を宣言した場合に驚いています。 – Ghita