{"id":505,"date":"2013-01-24T22:47:13","date_gmt":"2013-01-24T14:47:13","guid":{"rendered":"http:\/\/guoh.ai\/lifelog\/?p=505"},"modified":"2013-01-24T22:54:52","modified_gmt":"2013-01-24T14:54:52","slug":"newbie-cpp-learn-abstract-class","status":"publish","type":"post","link":"https:\/\/guoh.ai\/lifelog\/2013\/01\/newbie-cpp-learn-abstract-class\/","title":{"rendered":"[\u83dc\u9e1f\u5b66C++]\u62bd\u8c61\u7c7b"},"content":{"rendered":"<div class=\"gfmr-markdown-container\"><div class=\"gfmr-markdown-source\" style=\"display: none;\">&lt;p&gt;\u83dc\u9e1f\u5b66C++&lt;br \/&gt;\n&lt;a href=&quot;http:\/\/stackoverflow.com\/questions\/388242\/the-definitive-c-book-guide-and-list&quot; target=&quot;_blank&quot;&gt;http:\/\/stackoverflow.com\/questions\/388242\/the-definitive-c-book-guide-and-list&lt;\/a&gt;&lt;br \/&gt;\n\u7406\u8bba\u4e0d\u61c2\u5c31\u5b9e\u8df5\uff0c\u5b9e\u8df5\u4e0d\u884c\u5c31\u7406\u8bba&lt;\/p&gt;\n&lt;p&gt;AbstractClass.h&lt;\/p&gt;\n&lt;pre class=&quot;brush: cpp; title: ; notranslate&quot; title=&quot;&quot;&gt;#ifndef ABSTRACTCLASS_H_\r\n#define ABSTRACTCLASS_H_\r\n\r\nclass AbstractClass\r\n{\r\n  public:\r\n    AbstractClass();\r\n    virtual ~AbstractClass();\r\n  \r\n  public:\r\n    virtual void im() = 0;\r\n};\r\n#endif \/* ABSTRACTCLASS_H_ *\/&lt;\/pre&gt;\n&lt;p&gt;AbstractClass.cc&lt;\/p&gt;\n&lt;pre class=&quot;brush: cpp; title: ; notranslate&quot; title=&quot;&quot;&gt;#include &quot;AbstractClass.h&quot;\r\n\r\nAbstractClass::AbstractClass()\r\n{\r\n}\r\n\r\nAbstractClass::~AbstractClass()\r\n{\r\n}\r\n\r\nvoid AbstractClass::im()\r\n{}&lt;\/pre&gt;\n&lt;p&gt;Main.cc&lt;\/p&gt;\n&lt;pre class=&quot;brush: cpp; title: ; notranslate&quot; title=&quot;&quot;&gt;#include &lt;iostream&gt;\r\n\r\n#include &quot;AbstractClass.h&quot;\r\n\r\nusing namespace std;\r\n\r\nclass ConcreteClass : public AbstractClass\r\n{\r\n  public:\r\n    ConcreteClass() {};\r\n    virtual ~ConcreteClass() {};\r\n\r\n  public:\r\n    virtual void im()\r\n    {\r\n        cout &lt;&lt; &quot;ConcreteClass::im&quot; &lt;&lt; endl;\r\n    };\r\n};\r\n\r\nvoid hello(AbstractClass *ac)\r\n{\r\n    ac-&gt;im();\r\n}\r\n\r\nint main(int argc, char* argv&#x5B;])\r\n{\r\n    AbstractClass *pAC = new ConcreteClass();\r\n    hello(pAC);\r\n    delete pAC;\r\n    pAC = NULL;\r\n    return 0;\r\n}&lt;\/pre&gt;\n&lt;pre class=&quot;brush: bash; title: ; notranslate&quot; title=&quot;&quot;&gt;~\/dev\/workspace\/labs\/ccpp\/cc_abstract_class$ g++ Main.cc \r\n\/tmp\/ccQrfLyb.o: In function `ConcreteClass::ConcreteClass()&#039;:\r\nMain.cc:(.text._ZN13ConcreteClassC2Ev&#x5B;_ZN13ConcreteClassC5Ev]+0x14): undefined reference to `AbstractClass::AbstractClass()&#039;\r\n\/tmp\/ccQrfLyb.o: In function `ConcreteClass::~ConcreteClass()&#039;:\r\nMain.cc:(.text._ZN13ConcreteClassD2Ev&#x5B;_ZN13ConcreteClassD5Ev]+0x1f): undefined reference to `AbstractClass::~AbstractClass()&#039;\r\n\/tmp\/ccQrfLyb.o:(.rodata._ZTI13ConcreteClass&#x5B;typeinfo for ConcreteClass]+0x10): undefined reference to `typeinfo for AbstractClass&#039;\r\ncollect2: ld returned 1 exit status&lt;\/pre&gt;\n&lt;p&gt;\u7136\u540e\u8fd9\u6837\u7f16\u8bd1\u5c31\u53ef\u4ee5\u4e86&lt;\/p&gt;\n&lt;pre class=&quot;brush: bash; title: ; notranslate&quot; title=&quot;&quot;&gt;~\/dev\/workspace\/labs\/ccpp\/cc_abstract_class$ g++ Main.cc AbstractClass.cc&lt;\/pre&gt;\n<\/div><div class=\"gfmr-markdown-rendered\"><p>\u83dc\u9e1f\u5b66C++<br \/>\n<a href=\"http:\/\/stackoverflow.com\/questions\/388242\/the-definitive-c-book-guide-and-list\" target=\"_blank\">http:\/\/stackoverflow.com\/questions\/388242\/the-definitive-c-book-guide-and-list<\/a><br \/>\n\u7406\u8bba\u4e0d\u61c2\u5c31\u5b9e\u8df5\uff0c\u5b9e\u8df5\u4e0d\u884c\u5c31\u7406\u8bba<\/p>\n<p>AbstractClass.h<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#ifndef ABSTRACTCLASS_H_\r\n#define ABSTRACTCLASS_H_\r\n\r\nclass AbstractClass\r\n{\r\n  public:\r\n    AbstractClass();\r\n    virtual ~AbstractClass();\r\n  \r\n  public:\r\n    virtual void im() = 0;\r\n};\r\n#endif \/* ABSTRACTCLASS_H_ *\/<\/pre>\n<p>AbstractClass.cc<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &quot;AbstractClass.h&quot;\r\n\r\nAbstractClass::AbstractClass()\r\n{\r\n}\r\n\r\nAbstractClass::~AbstractClass()\r\n{\r\n}\r\n\r\nvoid AbstractClass::im()\r\n{}<\/pre>\n<p>Main.cc<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">#include &lt;iostream&gt;\r\n\r\n#include &quot;AbstractClass.h&quot;\r\n\r\nusing namespace std;\r\n\r\nclass ConcreteClass : public AbstractClass\r\n{\r\n  public:\r\n    ConcreteClass() {};\r\n    virtual ~ConcreteClass() {};\r\n\r\n  public:\r\n    virtual void im()\r\n    {\r\n        cout &lt;&lt; &quot;ConcreteClass::im&quot; &lt;&lt; endl;\r\n    };\r\n};\r\n\r\nvoid hello(AbstractClass *ac)\r\n{\r\n    ac-&gt;im();\r\n}\r\n\r\nint main(int argc, char* argv&#x5B;])\r\n{\r\n    AbstractClass *pAC = new ConcreteClass();\r\n    hello(pAC);\r\n    delete pAC;\r\n    pAC = NULL;\r\n    return 0;\r\n}<\/pre>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">~\/dev\/workspace\/labs\/ccpp\/cc_abstract_class$ g++ Main.cc \r\n\/tmp\/ccQrfLyb.o: In function `ConcreteClass::ConcreteClass()&#039;:\r\nMain.cc:(.text._ZN13ConcreteClassC2Ev&#x5B;_ZN13ConcreteClassC5Ev]+0x14): undefined reference to `AbstractClass::AbstractClass()&#039;\r\n\/tmp\/ccQrfLyb.o: In function `ConcreteClass::~ConcreteClass()&#039;:\r\nMain.cc:(.text._ZN13ConcreteClassD2Ev&#x5B;_ZN13ConcreteClassD5Ev]+0x1f): undefined reference to `AbstractClass::~AbstractClass()&#039;\r\n\/tmp\/ccQrfLyb.o:(.rodata._ZTI13ConcreteClass&#x5B;typeinfo for ConcreteClass]+0x10): undefined reference to `typeinfo for AbstractClass&#039;\r\ncollect2: ld returned 1 exit status<\/pre>\n<p>\u7136\u540e\u8fd9\u6837\u7f16\u8bd1\u5c31\u53ef\u4ee5\u4e86<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">~\/dev\/workspace\/labs\/ccpp\/cc_abstract_class$ g++ Main.cc AbstractClass.cc<\/pre>\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>&lt;p&gt;\u83dc\u9e1f\u5b66C++&lt;br \/&gt; &lt;a href=&quot;http:\/\/stackoverflow.com\/questions\/388242\/the-definitive-c-book-guide-and-list&quot; target=&quot;_blank&quot;&gt;http:\/\/stackoverflow.com\/questions\/388242\/the-definitive-c-book-guide-and-list&lt;\/a&gt;&lt;br \/&gt; \u7406\u8bba\u4e0d\u61c2\u5c31\u5b9e\u8df5\uff0c\u5b9e\u8df5\u4e0d\u884c\u5c31\u7406\u8bba&lt;\/p&gt; &lt;p&gt;AbstractClass.h&lt;\/p&gt; &lt;pre class=&quot;brush: cpp; title: ; notranslate&quot; title=&quot;&quot;&gt;#ifndef ABSTRACTCLASS_H_ #define ABSTRACTCLASS_H_ class AbstractClass { public: AbstractClass(); virtual ~AbstractClass(); public: virtual void im() = 0; }; #endif \/* ABSTRACTCLASS_H_ *\/&lt;\/pre&gt; &lt;p&gt;AbstractClass.cc&lt;\/p&gt; &lt;pre class=&quot;brush: cpp; title: ; notranslate&quot; title=&quot;&quot;&gt;#include &quot;AbstractClass.h&quot; AbstractClass::AbstractClass() { } AbstractClass::~AbstractClass() { } void AbstractClass::im() {}&lt;\/pre&gt; &lt;p&gt;Main.cc&lt;\/p&gt; &hellip; <a href=\"https:\/\/guoh.ai\/lifelog\/2013\/01\/newbie-cpp-learn-abstract-class\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">[\u83dc\u9e1f\u5b66C++]\u62bd\u8c61\u7c7b<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_gfmr_meta_descriptions":[],"_gfmr_multilingual_taxonomy_terms":[],"footnotes":""},"categories":[28],"tags":[],"class_list":["post-505","post","type-post","status-publish","format-standard","hentry","category-cpp"],"_links":{"self":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts\/505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/comments?post=505"}],"version-history":[{"count":7,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts\/505\/revisions"}],"predecessor-version":[{"id":513,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/posts\/505\/revisions\/513"}],"wp:attachment":[{"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/media?parent=505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/categories?post=505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guoh.ai\/lifelog\/wp-json\/wp\/v2\/tags?post=505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}