C++類和繼承
阿新 • • 發佈:2019-02-07
C++與C語言類似,運算效率高,與java也有相似之處
一:基礎
1.輸入:C語言中使用scanf來輸入,需要宣告變數的型別,標頭檔案include<stdio.h>。
C++中只需要“cin>>變數”即可實現,標頭檔案include<iostream>。
2.輸出:C語言輸出用printf執行,也需要宣告變數的型別。
C++用“cout<<變數”即可完成。
二:類與繼承
類在Java中廣泛應用,C++中也可以用到類,但在定義方式上和Java不同,C++類中也可以由建構函式。
例如,現在定義一個Animal類,有構造方法和一個void型eat方法和breathe方法
這樣一個類就定義完成了。現在要求定義一個子類Fish,FishheAnimal呼吸方式不同,要求在Fish類中將breathe方法改為“Fish bubble”且要有子類的構造方法#include <iostream> using namespace std; class Animal { public : //方法為公共型別,還可以是protected或private型 Animal() //構造方法 { cout<<"Hello Animal"<<endl; } void eat() //void型eat方法 { cout<<"Animal eat"<<endl; } void breathe() { cout<<"Animal breathe"<<endl; } };
此時如果定義Fish的一個物件 fh,則fh.breathe()輸出將會是——Fish bubbleclass Fish:public Animal //java用extends表示繼承,C++用":public 父類"繼承 { public: Fish() //Fish 構造方法 { cout<<"Hello Fish"<<endl; } void breathe() { cout<<"Fish bubble"<<endl; //Fish對breathe方法進行覆蓋 } };
假如現在想讓Fish的breathe方法既能輸出父類的breathe方法又能輸出自己的breathe方法該怎麼辦?
這涉及了繼承關係中的方法重寫,實現程式碼如下:
void breathe()
{
Animal::breathe(); //在子類方法中新增父類方法即可,“::”表示作用域
cout<<"Fish bubble"<<endl;
}
如果現在我在定義一個函式fn如下
void fn(Animal *pan)
{
pan->breathe();
}
在主函式中定義Animal類指標*p,定義Fish類物件fh,令p=&fh,將p帶入函式fn,fn(p);輸出會是什麼?
答案——只有"Animal breathe"!Fish的“Fish bubble”哪去了?
這就涉及了C++的另一個特性——多型性,如果想在輸出時帶有Fish類特有的輸出,只需在Animal類breathe方法前加上“virtual”即可
virtual void breathe()
{
cout<<"Animal breathe"<<endl;
}
“virtual”下,只要傳的是子類的指標,在呼叫方法時,只要所呼叫的方法子類有就呼叫子類的,否則呼叫父類的。
Java中有抽象類,C++也有,Java中抽象類類名前需要寫abstract關鍵字,C++不用,定義是正常寫就行!
只需對抽象方法做改動,例將breathe方法改為抽象方法
virtual void breathe()=0;
在子類中將breathe方法例項化即可。