問題:舉例說明什么是抽象、對象篮灼、類忘古、實例、消息诅诱、封裝性髓堪、繼承性和多態(tài)性。(最好是能舉出一個系統(tǒng)性的例子能將以上概念都能涉及到)
抽象
現(xiàn)在有狗和貓兩只生物,我們不考慮它們的不同之處干旁,而概括出它們都擁有毛發(fā)長短驶沼,年齡的屬性,且都擁有會叫的行為的共同特征争群。從眾多的事物中抽取出共同的回怜、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征的過程就是抽象换薄。
類
我們將它們這種具有相同特征的事物抽象為一個類玉雾,這里我們將它們抽象為Animal類,這個類具有的屬性是length(長短)轻要,age(年齡)复旬,方法是bark()。
classAnimal{
private:
??? stringlength;
public:
??? Animal(stringstr) {
???????? length= str;
??? }
??? virtual voidbark() {
???????? cout<<"我會叫"<< endl;
??? }
};
繼承性
如果我們想建立一個新的類Dog冲泥,它與Animal這個類的內(nèi)容基本相同驹碍,在后者的基礎(chǔ)上添加了age(年齡)的屬性,并添加了返回年齡的方法凡恍,則:
class Dog :publicAnimal {
private:
??? intage;
public:
??? Dog(stringstr,inta ) :Animal(str) {
???????? age= a;
??? }
??? intShowAge() {
???????? returnage;
??? }
};
如果我們想建立一個新的類Cat志秃,它與Animal這個類的內(nèi)容基本相同,在后者的基礎(chǔ)上添加了age(年齡)的屬性嚼酝,并添加了與其它對象比較年齡大小的方法的方法洽损,則:
class Cat :publicAnimal {
private:
??? intage;
public:
??? Cat(stringstr,inta) :Animal(str) {
???????? age= a;
??? }
??? void CompareAge(inta) {
???????? if (age > a) cout
<< "我大"<< endl;
???????? else if (age == a) cout
<< "我們一樣大"<< endl;
???????? else cout << "它大"<< endl;
??? }
};
這就是類的繼承,Animal為基類革半,Dog與Cat為派生類,繼承達到了重用代碼功能和提高執(zhí)行效率的效果流码。
對象與實例
現(xiàn)在我們在主函數(shù)中給這個Dog類創(chuàng)造一個對象又官,命名為dog,則這個對象會擁有Dog類的屬性和方法漫试。dog即為Dog類的一個實例六敬,即以類為模板,構(gòu)造出了一個現(xiàn)實的具體的例子驾荣。這里我們給該對象的賦初值外构。
Dog dog("長", 4);
封裝性
但是,如果把對象的一些屬性設(shè)為private型(私有型)播掷,則其他對象就無法看到該對象的私有的變量或函數(shù)审编,只能訪問公共的服務(wù),例:將
intShowAge()
???????? returnage;
設(shè)為私有型歧匈,則cout<<dog.ShowAge();會出錯垒酬,原因為Dog::ShowAge()不可訪問,即把信息隱藏了,這就是類的封裝的作用勘究。
消息
消息是對象之間的相互請求矮湘,發(fā)消息的目的是請求某個實例對象執(zhí)行類中定義的某個操作,體現(xiàn)在函數(shù)的調(diào)用口糕。
同上缅阳,我們 Cat cat("短", 2);若cat想要比較自己與dog的年齡,則:
cat.CompareAge(dog.ShowAge());結(jié)果輸出“它大“景描,則通過消息傳遞十办,cat調(diào)用了dog返回年齡值的函數(shù),得知了dog的年齡伏伯,作為參數(shù)傳入自己比較年齡的函數(shù)橘洞,得出了結(jié)果。
多態(tài)性
當類之間存在層次結(jié)構(gòu)说搅,并且類之間是通過繼承關(guān)聯(lián)時炸枣,就會用到多態(tài)。多態(tài)意味著調(diào)用成員函數(shù)時弄唧,會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)适肠。
Dog與Cat類繼承了基類的這個方法:
virtual voidbark() {
???????? cout<<"我會叫"<< endl;
??? }
我們在Dog類和Cat類中分別重寫這個函數(shù):
voidbark(){
???????? cout<<"我會汪汪叫"<< endl;
??? }
voidbark(){
???????? cout<<"我會喵喵叫"<< endl;
??? }
在主函數(shù)中:
Animal* animal;
??? Dogdog("長", 4);
??? Catcat("短", 2);
??? animal= &dog;
??? animal->bark();
??? animal= &cat;
??? animal->bark();
輸出為:
我會汪汪叫
我會喵喵叫
這里animal的指針指向不同對象時,調(diào)用同一函數(shù)會產(chǎn)生不同的結(jié)果候引,原因就是多態(tài)性會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)侯养,實現(xiàn)了接口重用。