C++/java 繼承類(lèi)的多態(tài)詳解及實(shí)例代碼
C++/java 繼承類(lèi)的多態(tài)詳解
學(xué)過(guò)C++和Java的人都知道,他們二者由于都可以進(jìn)行面向?qū)ο缶幊?,而面向?qū)ο缶幊痰娜筇匦跃褪欠庋b、繼承、多態(tài),所有今天我們就來(lái)簡(jiǎn)單了解一下C++和Java在多態(tài)這方面的不同。
首先我們各看一個(gè)案例。
C++
//測(cè)試?yán)^承與多態(tài)
class Animal {
public:
char name[128];
char behavior[128];
void outPut() {
cout << "Animal" << endl;
}
void outPutAnimal() {
cout << "Father" << endl;
}
Animal() {
strcpy(name, "Animal");
strcpy(behavior, "Call");
}
};
class Dog: public Animal {
public:
//子類(lèi)定義一個(gè)和父類(lèi)相同的屬性
char name[128];
char sex;
//子類(lèi)重寫(xiě)父類(lèi)方法
void outPut() {
cout << "Dog" << endl;
}
void outPutDog() {
cout << "Son" << endl;
}
Dog() {
strcpy(name, "Dog");
sex = 'M';
}
};
以上兩個(gè)類(lèi)都很簡(jiǎn)單,我們來(lái)看一下其測(cè)試代碼和結(jié)果。
/* 沒(méi)有多態(tài)的情況下測(cè)試結(jié)果和Java相同 Dog dog; cout << dog.name << endl; cout << dog.sex << endl; cout << dog.behavior << endl; dog.outPut(); dog.outPutAnimal(); dog.outPutDog(); //可通過(guò)如下方式訪問(wèn)父類(lèi)的行為 dog.Animal::outPut(); */ //多態(tài)的情況下: Animal *dog = new Dog; cout << dog->name << endl; cout << dog->behavior << endl; dog->outPut(); dog->outPutAnimal(); //測(cè)試結(jié)果 Animal Call Animal Father
可以看出所有的表現(xiàn)都是父類(lèi)的行為,無(wú)論是相同的屬性還是重寫(xiě)的方法。在這里需要說(shuō)明一下,如果子類(lèi)隱藏了父類(lèi)的成員函數(shù),則父類(lèi)中所有同名的成員函數(shù)(重載的函數(shù))均被隱藏。如果想要訪問(wèn)父類(lèi)中被隱藏的函數(shù),需要通過(guò)父類(lèi)名稱(chēng)來(lái)訪問(wèn)(dog.Animal::outPut();)。
在多態(tài)的情況下我們?cè)L問(wèn)的都是父類(lèi)的行為,那怎樣才能訪問(wèn)到子類(lèi)的函數(shù)呢?答案是通過(guò)定義虛函數(shù)來(lái)實(shí)現(xiàn),這個(gè)我們后面的博文講解。
現(xiàn)在我們?cè)趤?lái)看一下Java的表現(xiàn)。
Java
//父類(lèi)
public class Animal {
public String name = "Animal";
public String behavior = "Call";
public void outPut() {
System.out.println("Animal");
}
public void outPutAnimal() {
System.out.println("Father");
}
}
//子類(lèi)
public class Dog extends Animal{
public String name = "Dog";
public char sex = 'M';
public void outPut() {
System.out.println("Dog");
}
public void outPutDog() {
System.out.println("Son");
}
}
子類(lèi)也是定義了一個(gè)和父類(lèi)相同的屬性,同時(shí)也重寫(xiě)了父類(lèi)的一個(gè)方法,我們看一下其測(cè)試方法和測(cè)試結(jié)果。
public static void main(String[] args) {
Animal dog = new Dog();
System.out.println(dog.name);
System.out.println(dog.behavior);
dog.outPut();
dog.outPutAnimal();
}
//測(cè)試結(jié)果
Animal//父類(lèi)行為
Call
Dog//表現(xiàn)的是子類(lèi)的行為
Father
從這里可以看出,Java和C++還是有區(qū)別的,Java的屬性表現(xiàn)的是父類(lèi)的行為,但是重寫(xiě)的方法卻是子類(lèi)的行為,而C++全部都是父類(lèi)的行為。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Java中繼承、多態(tài)、重載和重寫(xiě)介紹
- Java封裝、繼承、多態(tài)三大特征的理解
- java用接口、多態(tài)、繼承、類(lèi)計(jì)算三角形和矩形周長(zhǎng)及面積的方法
- Java面向?qū)ο缶幊蹋ǚ庋b/繼承/多態(tài))實(shí)例解析
- java中重載,繼承,重寫(xiě)和多態(tài)的區(qū)別
- Java 繼承與多態(tài)的深入理解
- 詳解java封裝繼承多態(tài)
- 詳解Java中的封裝、繼承、多態(tài)
- 淺談java 面對(duì)對(duì)象(抽象 繼承 接口 多態(tài))
- Java初學(xué)者入門(mén)之繼承和多態(tài)
相關(guān)文章
Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)
這篇文章主要介紹了Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java多線程并發(fā)開(kāi)發(fā)之DelayQueue使用示例
這篇文章主要為大家詳細(xì)介紹了Java多線程并發(fā)開(kāi)發(fā)之DelayQueue使用示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
SpringBoot中@Transiactional注解沒(méi)有效果的解決
這篇文章主要介紹了SpringBoot中@Transiactional注解沒(méi)有效果的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot健康檢查監(jiān)控全過(guò)程
文章介紹了Spring Boot如何使用Actuator和Micrometer進(jìn)行健康檢查和監(jiān)控,通過(guò)配置和自定義健康指示器,開(kāi)發(fā)者可以實(shí)時(shí)監(jiān)控應(yīng)用組件的狀態(tài),Micrometer支持多種監(jiān)控系統(tǒng),如Prometheus,而Grafana則用于可視化監(jiān)控?cái)?shù)據(jù),文章還提供了配置示例和常見(jiàn)問(wèn)題解決方案2025-01-01
Java集合操作之List接口及其實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java集合操作之List接口及其實(shí)現(xiàn)方法,詳細(xì)分析了Java集合操作中List接口原理、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2015-07-07

