![]() ![]() |
|
二级C++多态性:抽象类和纯虚函数 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:40:14 文章录入:杜斌 责任编辑:杜斌 | |
|
|
1、 纯虚函数: 纯虚函数是一种特殊的虚函数,它的一般格式如下: class< 类名 > { virtual < 类型 >< 函数名 >(< 参数表 >)=0; …… }; 一般情况下可将一个成员函数在基类中声明为纯虚函数,其实现在派生类中完成。 例:一个使用纯虚函数的例子: #include class phoneCard { public: virtual bool performDial()=0; double getBalance() { return balance; } phoneCard(double ba) { balance=ba; } protected: double balance; }; class none_phoneCard:public phoneCard { public: char *getSetType() { return phoneSetType; } protected: char phoneSetType[20]; }; class number_phoneCard:public phoneCard { public: bool performConnection(long cn,int pw) { if(cn==cardNumber&&pw==password) { connected=true; return true; } else return false; } number_phoneCard(long ca,int pa,char *per, bool co,double ba):phoneCard(ba) { cardNumber=ca; password=pa; connectNumber=per; connected=co; } protected: long cardNumber; int password; char* connectNumber; bool connected; }; class magCard:public none_phoneCard { public: char usefulArea; bool performDial() { if(balance>0.9) { balance-=0.9; return true; } else return false; } }; class IC_card: public none_phoneCard { public: bool performDial() { if(balance>0.5) { balance-=0.5; return true; } else return false; } }; class IP_card:public number_phoneCard { public: char expireDate[20]; bool performDial() { if(balance>0.3&&expireDate>"20011220") { balance-=0.3; return true; } else return false; } }; class D200_card :public number_phoneCard { public: double additoryFee; bool performDial() { if(balance>(0.5+additoryFee)) { balance-=(0.5+additoryFee); } else return false; } D200_card(double add=0,long ca=0,int pa=0, char *con="00000000",bool connected=false, double ba=0):number_phoneCard(ca,pa,con,connected,ba) { additoryFee=add; } }; void main() { D200_card obj1(0,163,1234567,"163",false,50); cout< obj1.performDial(); cout< } 运行结果: 50 49.5 学员可自行分析一下该程序中的类之间的继承关系。 2、抽象类: 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。 ⑴抽象类的定义: 称带有纯虚函数的类为抽象类。 ⑵抽象类的作用: 抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以再将这些语义传给自己的子类。 (3)使用抽象类时注意: • 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。 • 抽象类是不能定义对象的。 如上例中, phoneCard,none_phoneCard,number_phoneCard 等就是抽象类,不能为其建立对象。而 magCard,IC_card,IP_card,D200_card 等实现了纯虚函数 performDial() ,从而是具体的类,可以建立对象。 |
|
![]() ![]() |