<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[linux c++ ( inherit and derive)类的派生]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Mon, 07 Apr 2008 08:08:57 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	note: look the sentence which have comments<br/>当父类定义了一个函数，而子类也定义了一个同名的常函数，这时就会存在函数覆盖：<br/>******illustrate********<br/>#include &lt;iostream.h&gt;<br/>class test<br/>{<br/>public:<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;this is base&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class member<br/>{<br/>public:<br/>void greet()<br/>{<br/>cout&lt;&lt;&quot;this is a member&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class derive:public test<br/>{<br/>private:<br/>member x;//because member have not parameters, so don&#039;t need constructor<br/>public:<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;this is a derive&quot;&lt;&lt;endl;<br/>x.greet();<br/>}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>};<br/>int main()<br/>{<br/>derive de;<br/>de.output();<br/>de.test::output(); //if want to invoking the father class&#039;s function, must append the ::<br/>return 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>}<br/>****the answer******<br/>this is a derive<br/>this is a member<br/>this is base<br/><br/>now, we modify above programe, append the constructor<br/>成员类和父类构造器的初始化，初始化父类时，使用的是类名，初始化成员类时，使用的是成员名<br/>#include &lt;iostream.h&gt;<br/>class test<br/>{<br/>private:<br/>int x;<br/>public:<br/>test(int y)<br/>{<br/>x=y;<br/>}<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;this is base&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class member<br/>{<br/>private:<br/>float f1;<br/>char ch;<br/>public:<br/>member(float f,char ch1)<br/>{<br/>f1=f;<br/>ch=ch1;<br/>}<br/>void greet()<br/>{<br/>cout&lt;&lt;&quot;this is a member&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class derive:public test<br/>{<br/>private:<br/>member x;//because member have not parameters, so don&#039;t need constructor<br/>public:<br/>derive(int x1,float y,char chr):test(x1),x(y,chr) //member class and parent class&#039;s initialize<br/>{}<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;this is a derive&quot;&lt;&lt;endl;<br/>x.greet();<br/><br/>}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>};<br/>int main()<br/>{<br/>derive de(45,12.32,&#039;h&#039;);<br/>de.output();<br/>de.test::output();<br/>return 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>}<br/>构造和析构的调用顺序<br/>先是父类中的成员类的构造函数先调用，然后才是父类的构造函数，接下来就是子类，调用顺序相同，而析构相反。如果继承了多个类（多重继承），则按它们在定义派生类时的声明顺序有关。<br/>*******illustrate***********<br/>#include &lt;iostream.h&gt;<br/>class member<br/>{<br/>public:<br/>member()<br/>{<br/>cout&lt;&lt;&quot;invoking the parent member constructor&quot;&lt;&lt;endl;<br/>}<br/>~member()<br/>{<br/>cout&lt;&lt;&quot;deconstruct&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class test<br/>{<br/>private:<br/>int x;<br/>member xy;<br/>public:<br/>test(int y)<br/>{<br/>cout&lt;&lt;&quot;parent constructor&quot;&lt;&lt;endl;<br/>x=y;<br/>}<br/>~test()<br/>{<br/>cout&lt;&lt;&quot;the parent destruct&quot;&lt;&lt;endl;<br/>}<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;this is base&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class member1<br/>{<br/>private:<br/>float f1;<br/>char ch;<br/>public:<br/>member1(float f,char ch1)<br/>{<br/>f1=f;<br/>ch=ch1;<br/>}<br/>void greet()<br/>{<br/>cout&lt;&lt;&quot;this is a member&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class derive:public test<br/>{<br/>private:<br/>member1 x;//because member have not parameters, so don&#039;t need constructor<br/>public:<br/>derive(int x1,float y,char chr):test(x1),x(y,chr)<br/>{cout&lt;&lt;&quot;invoking the derive constructor&quot;&lt;&lt;endl;}<br/>~derive()<br/>{<br/>cout&lt;&lt;&quot;the derive destruct &quot;&lt;&lt;endl;<br/>}<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;this is a derive&quot;&lt;&lt;endl;<br/>x.greet();<br/>}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>};<br/>int main()<br/>{<br/>derive de(45,12.32,&#039;h&#039;);<br/>de.output();<br/>de.test::output();<br/>return 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>}<br/>*********over*********<br/>mapping up-----向上映射<br/>we can use the above programe, define a new object<br/>append the follow contents in main:<br/>test te=derive(25,12.36,&#039;a&#039;); //this is mapping up<br/>te.output();<br/>注意：只有公有继承才能向上映射，private, protected不能向上映射<br/>多重继承的二义性<br/>例如：<br/>class base1<br/>{<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base1&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class base2<br/>{<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base2&quot;;<br/>}<br/>};<br/>class derive:public base1,public base2<br/>{<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;the derive class&quot;&lt;&lt;endl;<br/>}<br/>};<br/>int main()<br/>{<br/>derive der;<br/>der.display(); //现在这个语句就会出现二义性，不知调用父类的哪一个常函数，加上作用域就可以了<br/>der.base1::display();<br/>der.base2::display();// now, it can run rightly<br/>return 0;<br/>}<br/>访问共同基类成员时的二义性<br/>class base<br/>{<br/>public:<br/>base()<br/>{<br/>cout&lt;&lt;&quot;base constructor&quot;&lt;&lt;endl;<br/>}<br/>void common()<br/>{<br/>cout&lt;&lt;&quot;base&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class base1:public base<br/>{<br/>public:<br/>base1()<br/>{<br/>cout&lt;&lt;&quot;base1.constructor&quot;&lt;&lt;endl;<br/>}<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base1&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class base2:public base<br/>{<br/>public:<br/>base2()<br/>{<br/>cout&lt;&lt;&quot;base2.constructor&quot;&lt;&lt;endl;<br/>}<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base2&quot;;<br/>}<br/>};<br/>class derive:public base1,public base2<br/>{<br/>public:<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;the derive class&quot;&lt;&lt;endl;<br/>}<br/>};<br/>int main()<br/>{<br/>derive der;<br/>//der.common(); //现在这个就会出现二义性，因为不知是通过哪个父类调用父类的父类<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //解决办法，仍然是用作用域来解决。只不过会对父类有两次拷贝<br/>der.base1::common();<br/>return 0;}<br/>******the result******<br/>base constructor<br/>base1.constructor<br/>base constructor<br/>base2.constructor<br/>base<br/>从以上结果可以看出，基类的构造函数被调用了两次。<br/>*******虚基类*************<br/>利用上面的程序，只需在继承自共同基类的派生类声明时显示地标明继承方式为虚拟（virtual）继承，其格式为：<br/>&lt;derived name&gt;:&lt;virtual&gt;&lt;inherit mode&gt;&lt;base name&gt;<br/>******illustrate**********<br/>class base<br/>{<br/>public:<br/>base()<br/>{<br/>cout&lt;&lt;&quot;base constructor&quot;&lt;&lt;endl;<br/>}<br/>void common()<br/>{<br/>cout&lt;&lt;&quot;base&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class base1:virtual public base<br/>{<br/>public:<br/>base1()<br/>{<br/>cout&lt;&lt;&quot;base1.constructor&quot;&lt;&lt;endl;<br/>}<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base1&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class base2:virtual public base<br/>{<br/>public:<br/>base2()<br/>{<br/>cout&lt;&lt;&quot;base2.constructor&quot;&lt;&lt;endl;<br/>}<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base2&quot;;<br/>}<br/>};<br/>class derive:public base1,public base2<br/>{<br/>public:<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;the derive class&quot;&lt;&lt;endl;<br/>}<br/>};<br/>int main()<br/>{<br/>derive der;<br/>der.common(); //现在这个就不会出现二义性<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>//der.base1::common();<br/>return 0;}<br/>the result:<br/>base constructor<br/>base1.constructor<br/>base constructor<br/>base2.constructor<br/>base<br/>从以上结果可以看出，父类的构造函数只调用了一次<br/>虚基类的初始化<br/>在虚拟继承中，必须在最晚派生类的构造函数中显式地调用虚基类的构造函数，其格式如下：<br/>&lt;the last derive class constructor&gt;&lt;parameter list&gt;&lt;direct base&#039;s constructor&gt;&lt;member object constructor&gt;&lt;virtual base class constructor&gt;{define new append members }<br/>*******illustrate*******<br/>#include &lt;iostream.h&gt;<br/>class base<br/>{<br/>private:<br/>int i;<br/>public:<br/>base(int x)<br/>{<br/>i=x;<br/>cout&lt;&lt;&quot;base constructor&quot;&lt;&lt;endl;<br/>cout&lt;&lt;i&lt;&lt;endl;<br/>}<br/>int geti() const<br/>{<br/>return i;<br/>}<br/>void common()<br/>{<br/>cout&lt;&lt;&quot;base&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class base1:virtual public base<br/>{<br/>int y;<br/>public:<br/>base1(int w,int z):base(w)<br/>{<br/>y=z;<br/>cout&lt;&lt;&quot;base1.constructor&quot;&lt;&lt;endl;<br/>}<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base1&quot;&lt;&lt;endl;<br/>}<br/>};<br/>class base2:virtual public base<br/>{private:<br/>int aa;<br/>public:<br/>base2(int a, int b):base(b)<br/>{<br/>aa=a;<br/>cout&lt;&lt;&quot;base2.constructor&quot;&lt;&lt;endl;<br/>}<br/>void display()<br/>{<br/>cout&lt;&lt;&quot;base2&quot;;<br/>}<br/>int geti() const<br/>{<br/>return aa;<br/>}<br/>};<br/>class derive:public base1,public base2<br/>{<br/>public:<br/>derive(int a1,int a2,int a3,int a4):base1(a1,a2),base2(a3,a4),base(a4){} <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //initialize the virtual base class constructor<br/>void output()<br/>{<br/>cout&lt;&lt;&quot;the derive class&quot;&lt;&lt;endl;<br/>}<br/>};<br/>int main()<br/>{<br/>derive der(12,25,34,45);<br/>der.common(); //<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br/>//der.base1::common();<br/>cout&lt;&lt;der.geti()&lt;&lt;endl;<br/>return 0;}
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] linux c++ ( inherit and derive)类的派生]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>