{"id":278,"date":"2011-01-28T18:09:26","date_gmt":"2011-01-28T17:09:26","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=278"},"modified":"2011-01-28T18:09:26","modified_gmt":"2011-01-28T17:09:26","slug":"virtuelle-funktionen-und-const-sind-immer-wieder-eine-freude-oder-wie-c0x-einen-fehler-verhindert-haette","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2011\/01\/28\/virtuelle-funktionen-und-const-sind-immer-wieder-eine-freude-oder-wie-c0x-einen-fehler-verhindert-haette\/","title":{"rendered":"virtuelle Funktionen und const sind immer wieder eine Freude&#8230; oder wie C++0x einen Fehler verhindert h\u00e4tte&#8230;"},"content":{"rendered":"<p>Wieder mal hat sich in unserer Software ein kleiner und ganz mieser Fehler eingeschlichen, obwohl der Entwickler &#8222;eigentlich&#8220; an alles gedacht hatte.<\/p>\n<pre lang=\"cpp\">class A\r\n{\r\n...\r\n\u00a0\u00a0\u00a0 virtual void Doit() const;\r\n...\r\n};\r\n\r\nclass DerivedA : public A\r\n{\r\n...\r\n\u00a0\u00a0\u00a0 virtual void Doit();\u00a0\r\n...\r\n};\r\n\r\nvoid Foo()\r\n{\r\n...\r\n    A *pA = Something();\r\n...\r\n    pA-&gt;Doit();\r\n...\r\n}<\/pre>\n<p lang=\"cpp\">Sieht alles gut aus. Leider fehlt das kleine nette Wort <em><strong>const<\/strong><\/em> beim \u00dcberscheiben der Funktion <em>Doit<\/em> und daraus folgt, dass <em>DerivedA::Doit<\/em> niemals aufgerufen wird.<\/p>\n<p lang=\"cpp\">Obwohl wir <em>VC-2010 <\/em>verwenden, hat der neue <em>C++0x<\/em> Standard noch keinen Einzug in unseren K\u00f6pfen gefunden.<br \/>\nDas kleine Wort <em><strong>override<\/strong><\/em> in <em>DerivedA<\/em> h\u00e4tte diesen Fehler verhindert.<\/p>\n<pre lang=\"cpp\">class DerivedA : public A\r\n{\r\n...\r\n\u00a0\u00a0\u00a0 virtual void Doit() override;\r\n\/\/ This line results in:\r\n\r\n\/\/ error C3668: 'DerivedA::Doit' :\r\n\/\/ method with override specifier 'override' did\r\n\/\/ not override any base class methods\r\n...\r\n};<\/pre>\n<p>Es wird wirklich Zeit, dass <em>C++0x<\/em> 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.<br \/>\n<em>override<\/em> ist sogar schon in <em>VC-2008 <\/em>und dem nativen Compiler implementiert. Allerdings wundert es mich, dass hier nicht dann auch gleich das Schl\u00fcsselwort <em>new <\/em>eingef\u00fchrt wurde.<br \/>\nAber das man unter dem gleichen Namen wirklich einen neuen\u00a0Slot in der <em>vtable<\/em> aufmacht ist wirklich eher selten. Ich pers\u00f6nlich hatte daf\u00fcr bisher noch keine Verwendung.\u00a0<\/p>\n<p>Leider ist <em>C++0x<\/em>\u00a0 nicht komplett in der C++ Doku in der <em>MSDN<\/em> hervorgehoben. Man kann nicht mal erkennen, dass <em>sealed<\/em> und <em>abstract <\/em>MS-Extensions sind, und <em>override<\/em> im Standard verankert ist. Schade&#8230;<\/p>\n<p>Damit man sich etwas besser einen halbwegs kompletten \u00dcberblick verschaffen kann habe ich hier ein paar Links zusammengestellt.<\/p>\n<p>Siehe auch:<\/p>\n<ul>\n<li>Explicit virtual function overrides<br \/>\n<a href=\"http:\/\/en.wikipedia.org\/wiki\/C%2B%2B0x#Explicit_virtual_function_overrides\">http:\/\/en.wikipedia.org\/wiki\/C%2B%2B0x#Explicit_virtual_function_overrides<\/a><\/li>\n<li>How to: Declare Override Specifiers in Native Compilations<br \/>\n<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/z8ew2153.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/z8ew2153.aspx<\/a><\/li>\n<li>C++0x Core Language Features In VC10: The Table<br \/>\n<a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2010\/04\/06\/c-0x-core-language-features-in-vc10-the-table.aspx\">http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2010\/04\/06\/c-0x-core-language-features-in-vc10-the-table.aspx<\/a><\/li>\n<li>Explicating the new C++ standard (C++0x), and its implementation in VC10<br \/>\n<a href=\"http:\/\/www.codeproject.com\/KB\/cpp\/cpp10.aspx\">http:\/\/www.codeproject.com\/KB\/cpp\/cpp10.aspx<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Wieder mal hat sich in unserer Software ein kleiner und ganz mieser Fehler eingeschlichen, obwohl der Entwickler &#8222;eigentlich&#8220; an alles gedacht hatte. class A { &#8230; \u00a0\u00a0\u00a0 virtual void Doit() const; &#8230; }; class DerivedA : public A { &#8230; \u00a0\u00a0\u00a0 virtual void Doit();\u00a0 &#8230; }; void Foo() { &#8230; A *pA = Something(); &#8230; &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2011\/01\/28\/virtuelle-funktionen-und-const-sind-immer-wieder-eine-freude-oder-wie-c0x-einen-fehler-verhindert-haette\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201evirtuelle Funktionen und const sind immer wieder eine Freude&#8230; oder wie C++0x einen Fehler verhindert h\u00e4tte&#8230;\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3],"tags":[99,370,248,136,171],"class_list":["post-278","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","tag-bug","tag-c","tag-c0x","tag-qualitaetssicherung","tag-vs-2010"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=278"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/278\/revisions"}],"predecessor-version":[{"id":736,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/278\/revisions\/736"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=278"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}