﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-jlz-文章分类-c++ primer plus 读书笔记</title><link>http://www.cppblog.com/jlz/category/8333.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 30 Sep 2008 12:37:39 GMT</lastBuildDate><pubDate>Tue, 30 Sep 2008 12:37:39 GMT</pubDate><ttl>60</ttl><item><title>第13章 类继承 (13.4 抽象基类)</title><link>http://www.cppblog.com/jlz/articles/62748.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Thu, 25 Sep 2008 03:24:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62748.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62748.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62748.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62748.html</trackback:ping><description><![CDATA[<p>抽象基类(abstract base class ,ABC)<br>&nbsp;&nbsp; C++通过纯虚函数(pure virtual function)提供未实现的函数.纯虚函数声明的结尾为 = 0 .<br>&nbsp;&nbsp;&nbsp; class BaseEllipse //abstract base class<br>{<br>private:<br>double x;<br>double y;<br>public:<br>BaseEllipse(double x0 = 0 , double y0 = 0):x(x0),y(yo){}<br>virtual ~BaseEllipse(){}<br>void Move(int nx,ny) { x = nx; y = ny;}<br>virtual double Area() const = 0; // a pure virtual funtion<br>}</p>
<p>&nbsp; 当类声明中包含纯虚函数时，则不能创建该类的对象，只能做为基类。要成为真正<br>ABC， 必须包含一个纯虚函数。</p>
<img src ="http://www.cppblog.com/jlz/aggbug/62748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-25 11:24 <a href="http://www.cppblog.com/jlz/articles/62748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.4 单设计模式) </title><link>http://www.cppblog.com/jlz/articles/62718.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Wed, 24 Sep 2008 15:17:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62718.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62718.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62718.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 希望有且只有一个类的实列返回给调用程序时，就可以使用单元素模式(singleton pattern):<br><br>&nbsp; class&nbsp; TheOnlyInstance<br>{<br>public:<br>static TheOnlyInstance * GetTheOnlyInstance();<br><br>protected:<br>TheOnlyInstance(){}<br>};<br><br>通过 把构造函数声明为protected,并去掉公有构造。防止局部实例被创建。<br><br>TheOnlyInstance the; // not allowed<br><br>只能通过公有静态方法GetTheOnlyInstance 来访问类。 <br>通过 把构造函数声明为protected,并去掉公有构造。防止局部实例被创建。<br><br>TheOnlyInstance *&nbsp; TheOnlyInstance ： GetTheOnlyInstance()<br>{<br>static TheOnlyInstance obj;<br>return &amp;obj;<br>}<br><br>检索指向这个类的指针，只需要调用GetTheOnlyInstance()<br><br>TheOnlyInstance* pTheOnlyInstance = TheOnlyInstance: GetTheOnlyInstance();
<img src ="http://www.cppblog.com/jlz/aggbug/62718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-24 23:17 <a href="http://www.cppblog.com/jlz/articles/62718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.4 有关虚函数注意事情)</title><link>http://www.cppblog.com/jlz/articles/62713.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Wed, 24 Sep 2008 13:51:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62713.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62713.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62713.html</trackback:ping><description><![CDATA[&nbsp; 重新定义隐藏方法:<br>&nbsp; <br>&nbsp;&nbsp; class Dwelling<br>{<br>&nbsp;public:<br>&nbsp; virtual void showperks(int a) const;<br>};<br><br>class Hovel: public Dwelling<br>{<br>public:<br>virtual void showperks() const;<br>};<br><br>Hovel trump;<br>trump.showperks();&nbsp; //valid<br>trump.showperks(5); //invalid<br><br>&nbsp;1.如果重新定义 继承的方法，要保持原型相同。但如果返回类型是基类引用或指针， 则可以修改为指向派生类的引用或指针，这种特性称为返回类型协变.<br><br>&nbsp;class Dwelling<br>{<br>&nbsp;public:<br>&nbsp; virtual Dewlling &amp; build(int n);<br>}; <br><br>class Hovel : public Dwelling<br>{<br>public:<br>virtual Hovel&nbsp; &amp;build(int n);<br>};<br><br>2. 如果基类声明被重载了，则在派生类中应该重定义所有的基类版本。否则其他版本将被隐藏。<br><br>&nbsp;&nbsp; class Dwelling<br>{<br>&nbsp;virtual void showperks(int a) const;<br>virtual void showperks(double x) const;<br>virtula void showperks() const;<br>};<br>&nbsp; class Hovel: public Dwelling<br>{<br>&nbsp;virtual void showperks(int a) const;<br>virtual void showperks(double x) const;<br>virtula void showperks() const;<br>};<br><br><br>
<img src ="http://www.cppblog.com/jlz/aggbug/62713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-24 21:51 <a href="http://www.cppblog.com/jlz/articles/62713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.4  指针和引用类型兼容性)</title><link>http://www.cppblog.com/jlz/articles/62431.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 15:47:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62431.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62431.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62431.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62431.html</trackback:ping><description><![CDATA[&nbsp; class Employee<br>{<br>private:<br>char name[40];<br>public:<br>void showname();<br>};<br><br>class Singer : public Employee<br>{<br>public:<br>&nbsp;void range();<br>};<br><br>Employee e;<br>Singer s;<br><br>Employee *pe = &amp;s; //允许向上隐式类型转换 <br>Singer *ps = (Singer*) &amp;e;&nbsp; //必须向下显式类型转换<br><br>&nbsp;pe-&gt;showname()&nbsp;&nbsp; //安全 因singer 是Employee(每个singer都继承姓名).<br><br>ps-&gt;range() ; //不安全，因Employee 并不是singer .
<img src ="http://www.cppblog.com/jlz/aggbug/62431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 23:47 <a href="http://www.cppblog.com/jlz/articles/62431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.4  为何需要虚构函数) </title><link>http://www.cppblog.com/jlz/articles/62429.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 15:38:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62429.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62429.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62429.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62429.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 使用虚构函数可以确保正确的析构函数顺序被调用。<br>&nbsp;&nbsp;&nbsp; virtual ~Brass();<br><br>&nbsp;&nbsp; 如果BrassPlus&nbsp; 包含一个执行某些操作的析构函数，则Brass必须有一个虚拟析构函数，即使该析构函数不执行任何操作。
<img src ="http://www.cppblog.com/jlz/aggbug/62429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 23:38 <a href="http://www.cppblog.com/jlz/articles/62429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.4 虚方法实现) </title><link>http://www.cppblog.com/jlz/articles/62428.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 15:33:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62428.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62428.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62428.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>#include&lt;iostream&gt;<br>#include&lt;cstring&gt;<br>using std::cout;<br>using std::ios_base;<br>using std::endl;<br>using std::cin;</p>
<p><br>#ifndef BRASS_H_<br>#define BRASS_H_<br>class Brass<br>{<br>private:<br>&nbsp;enum {MAX = 35};<br>&nbsp;char fullname[MAX];<br>&nbsp;long accNum;<br>&nbsp;double balance;<br>public:<br>&nbsp;Brass(const char* s="Nullbody",long&nbsp; an = -1, double&nbsp; bal=0.0);<br>&nbsp;void Deposit(double amt);<br>&nbsp;virtual void WithDraw(double amt);<br>&nbsp;double Balance() const;<br>&nbsp;virtual void ViewAcct() const;<br>&nbsp;virtual ~Brass(){}<br>};</p>
<p><br>class BrassPlus :public Brass<br>{<br>private:<br>&nbsp;double maxLoan;<br>&nbsp;double rate;<br>&nbsp;double owesBank;<br>public:<br>&nbsp;BrassPlus(const char* s="Nullbody", long an=-1,double bal = 0.0,double ml = 500,double r=0.10);<br>&nbsp;&nbsp;&nbsp; BrassPlus(const Brass &amp;ba, double ml = 500 ,double r= 0.1);<br>&nbsp;virtual void ViewAcct() const;<br>&nbsp;virtual void WithDraw(double amt);<br>&nbsp;void ResetMax(double m) { maxLoan = m;}<br>&nbsp;void ResetRate(double r) { rate = r;}<br>&nbsp;void ResetOwes() { owesBank = 0;}</p>
<p>};</p>
<p>#endif</p>
<p>&nbsp;</p>
<p>Brass::Brass(const char* s,long an, double bal)<br>{<br>&nbsp;std::strncpy(fullname,s,MAX-1);<br>&nbsp;fullname[MAX-1] = '\0';<br>&nbsp;accNum = an;<br>&nbsp;balance = bal;<br>}</p>
<p>void Brass::Deposit(double amt)<br>{<br>&nbsp;if(amt &lt; 0 )<br>&nbsp;&nbsp;cout&lt;&lt;"Negative desposit not allowed:"<br>&nbsp;&nbsp; &lt;&lt;"desposit is cancelled.\n";<br>&nbsp;else <br>&nbsp;&nbsp;balance +=amt;<br>}</p>
<p>void Brass::WithDraw(double amt)<br>{<br>&nbsp;&nbsp;if(amt &lt; 0 )<br>&nbsp;&nbsp;cout&lt;&lt;"Negative desposit not allowed:"<br>&nbsp;&nbsp; &lt;&lt;"desposit is cancelled.\n";<br>&nbsp;&nbsp;else if(amt &lt;=balance)<br>&nbsp;&nbsp;&nbsp;balance -= amt;<br>&nbsp;&nbsp;else <br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;"withdrawal amount of $"&lt;&lt;amt<br>&nbsp;&nbsp;&nbsp;&lt;&lt;"exceeds your balance.\n"<br>&nbsp;&nbsp;&nbsp;&lt;&lt;"withdrawal canceled.\n";</p>
<p>}</p>
<p>double Brass::Balance() const<br>{<br>&nbsp;return balance;<br>}</p>
<p>// 非构造函数不能使用成员初始化列表，但派生类方法可以调用公有的基类方法<br>void Brass::ViewAcct() const<br>{<br>&nbsp;//set up&nbsp; ###.## format<br>&nbsp;ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);<br>&nbsp;cout.setf(ios_base::showpoint);<br>&nbsp;cout.precision(2);<br>&nbsp;cout&lt;&lt;"Client:"&lt;&lt;fullname&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Account Numver:"&lt;&lt;accNum&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Balance:$"&lt;&lt;balance &lt;&lt;endl;</p>
<p>&nbsp;cout.setf(initialState);</p>
<p>}</p>
<p>BrassPlus::BrassPlus(const char* s,long an ,double bal,double ml ,double r):Brass(s,an,bal)<br>{<br>&nbsp;maxLoan&nbsp; =ml;<br>&nbsp;owesBank&nbsp; = 0.0;<br>&nbsp;rate = r;<br>}</p>
<p>BrassPlus::BrassPlus(const Brass &amp;ba,double ml,double r):Brass(ba)<br>{<br>&nbsp;maxLoan = ml;<br>&nbsp;owesBank = 0.0;<br>&nbsp;rate = r;<br>}</p>
<p>void BrassPlus::ViewAcct() const<br>{<br>&nbsp;ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);<br>&nbsp;cout.setf(ios_base::showpoint);<br>&nbsp;Brass::ViewAcct(); //dispaly base portion<br>&nbsp;cout&lt;&lt;"Maxinum loam:$"&lt;&lt;maxLoan&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Owed to Bank:$"&lt;&lt;owesBank&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Loan Rate:"&lt;&lt;100 * rate &lt;&lt;"%\n";<br>&nbsp;cout.setf(initialState);</p>
<p>}<br>void BrassPlus::WithDraw(double amt)<br>{<br>&nbsp;//set up ###.## format<br>&nbsp;ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);<br>&nbsp;cout.setf(ios_base::showpoint);<br>&nbsp;cout.precision(2);<br>&nbsp;double bal = Balance();<br>&nbsp;if(amt &lt;=bal)<br>&nbsp;&nbsp;Brass::WithDraw(amt);&nbsp; // 代码必须使用作用域解析操作符 <br>&nbsp;else if(amt &lt;= bal + maxLoan - owesBank)<br>&nbsp;{<br>&nbsp;&nbsp;double advance&nbsp; = amt - bal;<br>&nbsp;&nbsp;owesBank += advance *(1.0 + rate);<br>&nbsp;&nbsp;cout&lt;&lt;"Bank advance:$"&lt;&lt;advance&lt;&lt;endl;<br>&nbsp;&nbsp;cout&lt;&lt;"Finance charge:$"&lt;&lt;advance * rate &lt;&lt;endl;<br>&nbsp;&nbsp;Deposit(advance);<br>&nbsp;&nbsp;Brass::WithDraw(amt);</p>
<p>&nbsp;}<br>&nbsp;else <br>&nbsp;{<br>&nbsp;&nbsp;cout&lt;&lt;"Credit limit exceeded. transaction cancelled.\n";<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;cout.setf(initialState);</p>
<p>&nbsp;</p>
<p>}</p>
<p><br>//创建指向Brass 对象的指针数组，这样可以指向Brass也可以指向BrassPlus<br>// 使用一个数组来表示多种类型的对象，这就是多态</p>
<p>const int CLIENTS = 4;<br>const int LEN = 40;<br>int main()<br>{<br>&nbsp; Brass *p_client[CLIENTS];<br>&nbsp; int i;</p>
<p>&nbsp; for(i=0; i &lt;CLIENTS;i++)<br>&nbsp; {<br>&nbsp;&nbsp; char temp[LEN];<br>&nbsp;&nbsp;&nbsp; long tempnum;<br>&nbsp;&nbsp;&nbsp; double tempbal;<br>&nbsp;&nbsp;&nbsp; char kind;<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"Enter client's name:";<br>&nbsp;&nbsp;&nbsp; cin.getline(temp, LEN);</p>
<p>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"enter client's account number:";<br>&nbsp;&nbsp;&nbsp; cin&gt;&gt;tempnum;</p>
<p>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"enter opening balance :$";<br>&nbsp;&nbsp;&nbsp; cin&gt;&gt;tempbal;</p>
<p>&nbsp;&nbsp;&nbsp; cout&lt;&lt;" enter 1 for blass account or "<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt;" 2 for brassplus account:";</p>
<p>&nbsp;&nbsp;&nbsp; while(cin&gt;&gt;kind &amp;&amp;(kind != '1' &amp;&amp; kind !='2'))<br>&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"enter either 1 or 2:";<br>&nbsp;&nbsp;&nbsp; if(kind == '1')<br>&nbsp;&nbsp;&nbsp;&nbsp; p_client[i] = new Brass(temp,tempnum,tempbal);<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; double tmax, trate;<br>&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"enter the owerdraft limit:$";<br>&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; tmax;<br>&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"enter the interest rate "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt;"as a decimal fraction:";<br>&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; trate;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; p_client[i]&nbsp; = new BrassPlus(temp,tempnum,tempbal,tmax,trate);</p>
<p><br>&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp;&nbsp;&nbsp; while(cin.get() !='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp; continue;</p>
<p>&nbsp; }</p>
<p>&nbsp; cout&lt;&lt;endl;<br>&nbsp; for( i= 0 ;i&lt;CLIENTS;i++)<br>&nbsp; {<br>&nbsp;&nbsp; p_client[i]-&gt;ViewAcct();<br>&nbsp;&nbsp; cout&lt;&lt;endl;<br>&nbsp; }</p>
<p>&nbsp; for(i=0;i&lt;CLIENTS;i++)<br>&nbsp; {<br>&nbsp;&nbsp; delete p_client[i];</p>
<p>&nbsp; }</p>
<p>&nbsp; cout&lt;&lt;"done.\n";<br>&nbsp; return 0;</p>
<p>}</p>
<img src ="http://www.cppblog.com/jlz/aggbug/62428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 23:33 <a href="http://www.cppblog.com/jlz/articles/62428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.4  银行类实现) </title><link>http://www.cppblog.com/jlz/articles/62425.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 15:17:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62425.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62425.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62425.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62425.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>#include&lt;iostream&gt;<br>#include&lt;cstring&gt;<br>using std::cout;<br>using std::ios_base;<br>using std::endl;</p>
<p>#ifndef BRASS_H_<br>#define BRASS_H_<br>class Brass<br>{<br>private:<br>&nbsp;enum {MAX = 35};<br>&nbsp;char fullname[MAX];<br>&nbsp;long accNum;<br>&nbsp;double balance;<br>public:<br>&nbsp;Brass(const char* s="Nullbody",long&nbsp; an = -1, double&nbsp; bal=0.0);<br>&nbsp;void Deposit(double amt);<br>&nbsp;virtual void WithDraw(double amt);<br>&nbsp;double Balance() const;<br>&nbsp;virtual void ViewAcct() const;<br>&nbsp;virtual ~Brass(){}<br>};</p>
<p><br>class BrassPlus :public Brass<br>{<br>private:<br>&nbsp;double maxLoan;<br>&nbsp;double rate;<br>&nbsp;double owesBank;<br>public:<br>&nbsp;BrassPlus(const char* s="Nullbody", long an=-1,double bal = 0.0,double ml = 500,double r=0.10);<br>&nbsp;&nbsp;&nbsp; BrassPlus(const Brass &amp;ba, double ml = 500 ,double r= 0.1);<br>&nbsp;virtual void ViewAcct() const;<br>&nbsp;virtual void WithDraw(double amt);<br>&nbsp;void ResetMax(double m) { maxLoan = m;}<br>&nbsp;void ResetRate(double r) { rate = r;}<br>&nbsp;void ResetOwes() { owesBank = 0;}</p>
<p>};</p>
<p>#endif</p>
<p>&nbsp;</p>
<p>Brass::Brass(const char* s,long an, double bal)<br>{<br>&nbsp;std::strncpy(fullname,s,MAX-1);<br>&nbsp;fullname[MAX-1] = '\0';<br>&nbsp;accNum = an;<br>&nbsp;balance = bal;<br>}</p>
<p>void Brass::Deposit(double amt)<br>{<br>&nbsp;if(amt &lt; 0 )<br>&nbsp;&nbsp;cout&lt;&lt;"Negative desposit not allowed:"<br>&nbsp;&nbsp; &lt;&lt;"desposit is cancelled.\n";<br>&nbsp;else <br>&nbsp;&nbsp;balance +=amt;<br>}</p>
<p>void Brass::WithDraw(double amt)<br>{<br>&nbsp;&nbsp;if(amt &lt; 0 )<br>&nbsp;&nbsp;cout&lt;&lt;"Negative desposit not allowed:"<br>&nbsp;&nbsp; &lt;&lt;"desposit is cancelled.\n";<br>&nbsp;&nbsp;else if(amt &lt;=balance)<br>&nbsp;&nbsp;&nbsp;balance -= amt;<br>&nbsp;&nbsp;else <br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;"withdrawal amount of $"&lt;&lt;amt<br>&nbsp;&nbsp;&nbsp;&lt;&lt;"exceeds your balance.\n"<br>&nbsp;&nbsp;&nbsp;&lt;&lt;"withdrawal canceled.\n";</p>
<p>}</p>
<p>double Brass::Balance() const<br>{<br>&nbsp;return balance;<br>}</p>
<p>// 非构造函数不能使用成员初始化列表，但派生类方法可以调用公有的基类方法<br>void Brass::ViewAcct() const<br>{<br>&nbsp;//set up&nbsp; ###.## format<br>&nbsp;ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);<br>&nbsp;cout.setf(ios_base::showpoint);<br>&nbsp;cout.precision(2);<br>&nbsp;cout&lt;&lt;"Client:"&lt;&lt;fullname&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Account Numver:"&lt;&lt;accNum&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Balance:$"&lt;&lt;balance &lt;&lt;endl;</p>
<p>&nbsp;cout.setf(initialState);</p>
<p>}</p>
<p>BrassPlus::BrassPlus(const char* s,long an ,double bal,double ml ,double r):Brass(s,an,bal)<br>{<br>&nbsp;maxLoan&nbsp; =ml;<br>&nbsp;owesBank&nbsp; = 0.0;<br>&nbsp;rate = r;<br>}</p>
<p>BrassPlus::BrassPlus(const Brass &amp;ba,double ml,double r):Brass(ba)<br>{<br>&nbsp;maxLoan = ml;<br>&nbsp;owesBank = 0.0;<br>&nbsp;rate = r;<br>}</p>
<p>void BrassPlus::ViewAcct() const<br>{<br>&nbsp;ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);<br>&nbsp;cout.setf(ios_base::showpoint);<br>&nbsp;Brass::ViewAcct(); //dispaly base portion<br>&nbsp;cout&lt;&lt;"Maxinum loam:$"&lt;&lt;maxLoan&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Owed to Bank:$"&lt;&lt;owesBank&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"Loan Rate:"&lt;&lt;100 * rate &lt;&lt;"%\n";<br>&nbsp;cout.setf(initialState);</p>
<p>}<br>void BrassPlus::WithDraw(double amt)<br>{<br>&nbsp;//set up ###.## format<br>&nbsp;ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);<br>&nbsp;cout.setf(ios_base::showpoint);<br>&nbsp;cout.precision(2);<br>&nbsp;double bal = Balance();<br>&nbsp;if(amt &lt;=bal)<br>&nbsp;&nbsp;Brass::WithDraw(amt);&nbsp; // 代码必须使用作用域解析操作符 <br>&nbsp;else if(amt &lt;= bal + maxLoan - owesBank)<br>&nbsp;{<br>&nbsp;&nbsp;double advance&nbsp; = amt - bal;<br>&nbsp;&nbsp;owesBank += advance *(1.0 + rate);<br>&nbsp;&nbsp;cout&lt;&lt;"Bank advance:$"&lt;&lt;advance&lt;&lt;endl;<br>&nbsp;&nbsp;cout&lt;&lt;"Finance charge:$"&lt;&lt;advance * rate &lt;&lt;endl;<br>&nbsp;&nbsp;Deposit(advance);<br>&nbsp;&nbsp;Brass::WithDraw(amt);</p>
<p>&nbsp;}<br>&nbsp;else <br>&nbsp;{<br>&nbsp;&nbsp;cout&lt;&lt;"Credit limit exceeded. transaction cancelled.\n";<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;cout.setf(initialState);</p>
<p>&nbsp;</p>
<p>}</p>
<p><br>int main()<br>{<br>&nbsp;Brass piggy("porcelot pigg",3222233,111.00);<br>&nbsp;BrassPlus hoggy("hogg",3222333,3000.00);</p>
<p>&nbsp;piggy.ViewAcct();<br>&nbsp;cout&lt;&lt;endl;</p>
<p>&nbsp;hoggy.ViewAcct();<br>&nbsp;cout&lt;&lt;endl;</p>
<p>&nbsp;cout&lt;&lt;"Depositing $1000 into the hoggy accout:\n";<br>&nbsp;hoggy.Deposit(1000.00);<br>&nbsp;cout&lt;&lt;"new balance :$"&lt;&lt;hoggy.Balance()&lt;&lt;endl;</p>
<p>&nbsp;cout&lt;&lt;"WithDrawing $4200 from the pigg account:\n";</p>
<p>&nbsp;piggy.WithDraw(4200.00);<br>&nbsp;cout&lt;&lt;"pigg account balance :$"&lt;&lt;piggy.Balance()&lt;&lt;endl;<br>&nbsp;cout&lt;&lt;"with drawing $4200 from the hogg account.\n";<br>&nbsp;hoggy.WithDraw(4200.00);<br>&nbsp;hoggy.ViewAcct();<br>&nbsp;return 0;<br>}</p>
<img src ="http://www.cppblog.com/jlz/aggbug/62425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 23:17 <a href="http://www.cppblog.com/jlz/articles/62425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.4  多态公有继乘) </title><link>http://www.cppblog.com/jlz/articles/62402.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62402.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62402.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62402.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62402.html</trackback:ping><description><![CDATA[<p>&nbsp; 多态: 同一方法的行为将随上下文而不同。实现方法:<br>&nbsp; 1.&nbsp;在派生类中重定义基类方法<br>&nbsp; 2.使用虚方法<br><br>#ifndef BRASS_H_<br>#define BRASS_H_<br>class Brass<br>{<br>private:<br>&nbsp;enum {MAX = 35};<br>&nbsp;char fullname[MAX];<br>&nbsp;long accNum;<br>&nbsp;double balance;<br>public:<br>&nbsp;Brass(const char* s="Nullbody",long&nbsp; an = -1, double&nbsp; bal=0.0);<br>&nbsp;void Deposit(double amt);<br>&nbsp;virtual void WithDraw(double amt);<br>&nbsp;double Balance() const;<br>&nbsp;virtual void ViewAcct() const;<br>&nbsp;virtual ~Brass(){}<br>};</p>
<p><br>class BrassPlus :public Brass<br>{<br>private:<br>&nbsp;double maxLoan;<br>&nbsp;double rate;<br>&nbsp;double owesBank;<br>public:<br>&nbsp;BrassPlus(const char* s="Nullbody", long an=-1,double bal = 0.0,double ml = 500,double r=0.10);<br>&nbsp;&nbsp;&nbsp; BrassPlus(const Brass &amp;ba, double ml = 500 ,double r= 0.1);<br>&nbsp;virtual void ViewAcct() const;<br>&nbsp;virtual void WithDraw(double amt);<br>&nbsp;void ResetMax(double m) { maxLoan = m;}<br>&nbsp;void ResetRate(double r) { rate = r;}<br>&nbsp;void ResetOwes() { owesBank = 0;}</p>
<p>};</p>
<p>#endif<br><br>&nbsp;&nbsp; 1.通过对象调用<br>&nbsp;&nbsp;&nbsp;&nbsp; Brass dom("dominic banker",1111,1111.45);<br>&nbsp;&nbsp;&nbsp;&nbsp; BrassPlus dot("dorothy banker",1222,222.99);<br>dom.ViewAcct();&nbsp; // use Brass::ViewAcct();<br>dot.ViewAcct();&nbsp; //use BrassPlus::ViewAcct();<br><br>&nbsp; 2.通过引用和指针<br>&nbsp;&nbsp;&nbsp; 如果ViewAcct不是virtual ,则<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Brass dom("dominic banker",1111,1111.45);<br>&nbsp;&nbsp;&nbsp;&nbsp; BrassPlus dot("dorothy banker",1222,222.99);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; Brass&nbsp;&amp;b1_ref&nbsp;&nbsp; = dom;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Brass &amp;b2_ref = dot;<br>&nbsp; b1_ref&nbsp;.ViewAcct() ; // use&nbsp;Brass::ViewAcct();<br>&nbsp; b2_ref.ViewAcct(); //use Brass:ViewAcct();<br><br>&nbsp;&nbsp;&nbsp;如果是Virtual 则<br>&nbsp;&nbsp;&nbsp; b1_ref&nbsp;.ViewAcct() ; // use&nbsp;Brass::ViewAcct();<br>&nbsp; b2_ref.ViewAcct(); //use BrassPlus::ViewAcct();<br><br>&nbsp;&nbsp;<br>&nbsp; </p>
<img src ="http://www.cppblog.com/jlz/aggbug/62402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 16:39 <a href="http://www.cppblog.com/jlz/articles/62402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.1.2 构造函数:访问权限的考虑)</title><link>http://www.cppblog.com/jlz/articles/62396.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62396.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62396.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62396.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 创建派生类对象时，程序首先创建基类对象。<br>&nbsp; RatedPlayer::RatedPlayer(unsigned int r, const char* fn, const char* ln, bool ht) :&nbsp; TableTennisPlayer(fn,ln,ht)<br>{<br>rating&nbsp; = r;<br>}<br><br>TableTennisPlayer(fn,ln,ht)&nbsp; 调用基类构造函数. 实参传递给TableTennisPlayer.<br><br>&nbsp;如果没有成员初始化列表。 则程序将使用默认的基类构造函数。&nbsp;<br>&nbsp; RatedPlayer::RatedPlayer(unsigned int r,const char * fn, const char * ln,bool ht)&nbsp; //&nbsp; TableTennisPlayer() 将调用<br>{<br>rating = r;<br>}<br><br>&nbsp;&nbsp;&nbsp; 第二种构造函数<br>&nbsp; RatedPlayer::RatedPalyer(unsigned int r, const TableTennisPlayer &amp;tp): TableTennisPalyer(tp)<br>{<br>rating = r;<br>}<br><br>const TableTennisPlayer &amp;tp&nbsp; 调用基类的复制构造函数。如果基类没有定义，则自动生成一个。因为这个类没有动态内存分配。<br>&nbsp;以上写法还可以写成<br>&nbsp; RatedPlayer::RatedPalyer(unsigned int r, const TableTennisPlayer &amp;tp): TableTennisPalyer(tp),rating(r)<br>{<br>}<br><br>
<img src ="http://www.cppblog.com/jlz/aggbug/62396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 15:39 <a href="http://www.cppblog.com/jlz/articles/62396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.1.1 派生一个类) </title><link>http://www.cppblog.com/jlz/articles/62394.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62394.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62394.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62394.html</trackback:ping><description><![CDATA[class RatedPlayer : public TableTennisPlayer<br>{<br>private:<br>&nbsp;unsigned int rating;<br>public:<br>&nbsp;RatePlayer(unsigned int r= 0 ,const char *fn = "none",const char *ln ="none",bool ht=false);<br>&nbsp;RatedPlayer(unsigned int r,const TableTennisPlayer &amp; tp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;unsigned int Rating() { return rating;}<br>&nbsp;void ResetRating(unsigned int r) { rating = r;}<br>};<br><br><br>关键点:<br>&nbsp;RatedPlayer(unsigned int r,const TableTennisPlayer &amp; tp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src ="http://www.cppblog.com/jlz/aggbug/62394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 15:20 <a href="http://www.cppblog.com/jlz/articles/62394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第13章 类继承 (13.1 一个简单的类)</title><link>http://www.cppblog.com/jlz/articles/62393.html</link><dc:creator>jz</dc:creator><author>jz</author><pubDate>Sun, 21 Sep 2008 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/jlz/articles/62393.html</guid><wfw:comment>http://www.cppblog.com/jlz/comments/62393.html</wfw:comment><comments>http://www.cppblog.com/jlz/articles/62393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jlz/comments/commentRss/62393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jlz/services/trackbacks/62393.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>#include&lt;iostream&gt;<br>#include&lt;cstring&gt;</p>
<p>#ifndef TABTENNO_H_<br>#define TABTENNO_H_<br>class TableTennisPlayer<br>{<br>private:<br>&nbsp;enum{ LIM = 20};<br>&nbsp;char firstname[LIM];<br>&nbsp;char lastname[LIM];<br>&nbsp;bool hasTable;<br>public:<br>&nbsp;TableTennisPlayer(const char *fn="none", const char *ln="none",bool ht = false);<br>&nbsp;void Name() const;<br>&nbsp;bool HasTable() const { return hasTable;}<br>&nbsp;void ResetTable(bool v) <br>&nbsp;{<br>&nbsp;&nbsp;hasTable&nbsp; = v;<br>&nbsp;}<br>};<br>#endif </p>
<p><br>TableTennisPlayer::TableTennisPlayer(const char *fn , const char *ln , bool ht )<br>{<br>&nbsp;std::strncpy(firstname,fn,LIM-1);<br>&nbsp;firstname[LIM-1] = '\0';<br>&nbsp;std::strncpy(lastname,ln,LIM-1);<br>&nbsp;lastname[LIM-1] = '\0';<br>&nbsp;hasTable = ht;<br>}</p>
<p>void TableTennisPlayer::Name()&nbsp; const<br>{<br>&nbsp;std::cout&lt;&lt;lastname&lt;&lt;" ,"&lt;&lt;firstname;</p>
<p>}</p>
<p>int main(void)<br>{<br>&nbsp;using std::cout;<br>&nbsp;TableTennisPlayer player1("chuck","Blizzard",true);<br>&nbsp;TableTennisPlayer player2("Tarza","Boomdea",false);</p>
<p>&nbsp;player1.Name();<br>&nbsp;if(player1.HasTable())&nbsp;&nbsp; //不可直接访问private 成员<br>&nbsp;{<br>&nbsp;&nbsp;cout&lt;&lt;":has a table.\n";</p>
<p>&nbsp;}else<br>&nbsp;{<br>&nbsp;&nbsp;cout&lt;&lt;":hasn't a table.\n";<br>&nbsp;}</p>
<p>&nbsp;player2.Name();<br>&nbsp;if(player2.HasTable())<br>&nbsp;&nbsp;cout &lt;&lt;":has a table.\n";<br>&nbsp;else<br>&nbsp;&nbsp;cout&lt;&lt;":hasn't a table.\n";</p>
<p>&nbsp;return 0;</p>
<p>}</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/jlz/aggbug/62393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jlz/" target="_blank">jz</a> 2008-09-21 15:04 <a href="http://www.cppblog.com/jlz/articles/62393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>