Wieder mal hat sich in unserer Software ein kleiner und ganz mieser Fehler eingeschlichen, obwohl der Entwickler „eigentlich“ an alles gedacht hatte.
class A
{
...
virtual void Doit() const;
...
};
class DerivedA : public A
{
...
virtual void Doit();
...
};
void Foo()
{
...
A *pA = Something();
...
pA->Doit();
...
}
Sieht alles gut aus. Leider fehlt das kleine nette Wort const beim Überscheiben der Funktion Doit und daraus folgt, dass DerivedA::Doit niemals aufgerufen wird.
Obwohl wir VC-2010 verwenden, hat der neue C++0x Standard noch keinen Einzug in unseren Köpfen gefunden.
Das kleine Wort override in DerivedA hätte diesen Fehler verhindert.
class DerivedA : public A
{
...
virtual void Doit() override;
// This line results in:
// error C3668: 'DerivedA::Doit' :
// method with override specifier 'override' did
// not override any base class methods
...
};
Es wird wirklich Zeit, dass C++0x auch wirklich genutzt wird, aber wie alles Neue muss man es sich besonders am Anfang immer wieder bewusst machen, damit es einem direkt zur Angewohnheit wird.
override ist sogar schon in VC-2008 und dem nativen Compiler implementiert. Allerdings wundert es mich, dass hier nicht dann auch gleich das Schlüsselwort new eingeführt wurde.
Aber das man unter dem gleichen Namen wirklich einen neuen Slot in der vtable aufmacht ist wirklich eher selten. Ich persönlich hatte dafür bisher noch keine Verwendung.
Leider ist C++0x nicht komplett in der C++ Doku in der MSDN hervorgehoben. Man kann nicht mal erkennen, dass sealed und abstract MS-Extensions sind, und override im Standard verankert ist. Schade…
Damit man sich etwas besser einen halbwegs kompletten Überblick verschaffen kann habe ich hier ein paar Links zusammengestellt.
Siehe auch:
- Explicit virtual function overrides
http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_virtual_function_overrides - How to: Declare Override Specifiers in Native Compilations
http://msdn.microsoft.com/en-us/library/z8ew2153.aspx - C++0x Core Language Features In VC10: The Table
http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx - Explicating the new C++ standard (C++0x), and its implementation in VC10
http://www.codeproject.com/KB/cpp/cpp10.aspx
So ein
new
hätte ich mir vor Jahren mal gewünscht, nur wußte ich damals noch nicht, daß es das mal geben wird. Die MFC hatte in einer neuen Version einer Klasse eine Funktion spendiert, die ich in meiner Ableitung bereits implementiert hatte. Ich weiß nicht mehr genau wie’s war, sowas verdrängt man ja gerne mal, aber die Umbenennungsorgie hätte ich mir mit einemnew
sicher ersparen können. Gut, daß ich diese Probleme bei PowerPoint nicht mehr kenne… 😀