{"id":2271,"date":"2015-04-09T08:16:15","date_gmt":"2015-04-09T07:16:15","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=2271"},"modified":"2015-04-09T08:18:17","modified_gmt":"2015-04-09T07:18:17","slug":"polymorphie-virtual-abstract-pure-deconstrutor-wtf","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=2271","title":{"rendered":"Polymorphie virtual abstract pure deconstrutor WTF?"},"content":{"rendered":"<p>Okay ich fasse mal zusammen. Ich sehe 3 F\u00e4lle, vom einfachsten zum schwersten.<\/p>\n<p><strong>1) Ganz normal Klassen ableiten.<\/strong><\/p>\n<pre><code>class Base {\r\npublic:\r\n  ~Base() {\r\n    cout << \"~TestClass\\n\";\r\n  }\r\n};\r\n\r\nclass Derived : public TestClass {\r\npublic:\r\n  ~Derived() {\r\n    cout << \"~Derived\\n\";\r\n  }\r\n};\r\n\r\nint main() {\r\n  {\r\n  cout << \"a\\n\";\r\n  Derived a;\r\n  }\r\n  cout << \"b\\n\";\r\n  Derived *b = new Derived();\r\n  delete b;\r\n}<\/code><\/pre>\n<pre>Ausgabe:\r\na                                                                                                                \r\n~Derived                                                                                                         \r\n~Base\r\nb\r\n~Derived\r\n~Base<\/pre>\n<p>Der Destructor wird immer aufgerufen.<br \/>\n<strong>2) Mit Polymorphie (Pointer ist vom Type Base)<\/strong><\/p>\n<pre><code>class Base {\r\npublic:\r\n  <strong>virtual<\/strong> ~Base() {\r\n    cout << \"~TestClass\\n\";\r\n  }\r\n};\r\n\r\nclass Derived : public TestClass {\r\npublic:\r\n  <strong>virtual<\/strong> ~Derived() {\r\n    cout << \"~Derived\\n\";\r\n  }\r\n};\r\n\r\nint main() {\r\n  {\r\n  cout << \"a\\n\";\r\n  Derived a;\r\n  }\r\n  cout << \"b\\n\";\r\n  <strong>Base<\/strong> *b = new Derived();\r\n  delete b;\r\n}<\/code><\/pre>\n<pre>Ausgabe:\r\na                                                                                                                \r\n~Derived                                                                                                         \r\n~Base\r\nb\r\n~Derived\r\n~Base<\/pre>\n<p>Der Destructor wird immer aufgerufen.<\/p>\n<p><strong>3) Mit Polymorphie und class Derived als abstracte Klasse<\/strong><\/p>\n<pre><code>\r\nclass Base {\r\npublic:\r\n  virtual ~Base() <strong>= 0<\/strong>;\r\n};\r\n\r\n<strong>Base::~Base() {\r\n    cout << \"~Base\\n\";\r\n}<\/strong>\r\n\r\nclass Derived : public Base {\r\npublic:\r\n  virtual ~Derived() {\r\n    cout << \"~Derived\\n\";\r\n  }\r\n};\r\n\r\nint main() {\r\n  {\r\n  cout << \"a\\n\";\r\n  Derived a;\r\n  }\r\n  cout << \"b\\n\";\r\n  Base *b = new Derived();\r\n  delete b;\r\n}\r\n<\/code><\/pre>\n<pre>Ausgabe:\r\na                                                                                                                \r\n~Derived                                                                                                         \r\n~Base\r\nb\r\n~Derived\r\n~Base<\/pre>\n<p>Der Destructor wird immer aufgerufen.<br \/>\nDer Destructor von Base ist zwar abstract, es gibt aber eine default Implementation, die im Zweifel garnichts macht. Es muss immer eine Implementation der Spezialfunktionen, wie dem Destructor, geben. Wird keine explicit angegeben, erstellt automatisch der Compiler eine. (Ausser man declariert ihn mit \"=0\" als abstract).<\/p>\n<p>Wozu das ganze? Abstrace Klassen k\u00f6nnen nicht instanziiert werden, sie dienen wirklich nur als ein abstractes Interface. Sollte man es dennoch versuchen, bekommt man folgende Compilerfehler:<\/p>\n<pre>error: cannot declare variable \u2018c\u2019 to be of abstract type \u2018Base\u2019\r\n Base c;\r\n note:   because the following virtual functions are pure within \u2018Base\u2019:\r\n virtual ~Base() = 0;\r\n<\/pre>\n<p>PS: Wird das <strong>virtual<\/strong> keyword mal vergessen, wird der Base Destructor im ung\u00fcnstigen Fall nicht aufgerufen ;)<\/p>\n<p>Hf<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Okay ich fasse mal zusammen. Ich sehe 3 F\u00e4lle, vom einfachsten zum schwersten. 1) Ganz normal Klassen ableiten. class Base { public: ~Base() { cout<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-2271","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2271"}],"version-history":[{"count":6,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2271\/revisions"}],"predecessor-version":[{"id":2277,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2271\/revisions\/2277"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2271"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}