1. 程式人生 > >C++類和繼承

C++類和繼承

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方法

#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,FishheAnimal呼吸方式不同,要求在Fish類中將breathe方法改為“Fish bubble”且要有子類的構造方法
class Fish:public Animal   //java用extends表示繼承,C++用":public 父類"繼承
{
public:
    Fish()                 //Fish 構造方法
    {
        cout<<"Hello Fish"<<endl;
    }
    void breathe()
    {
        cout<<"Fish bubble"<<endl; //Fish對breathe方法進行覆蓋
    }
};
此時如果定義Fish的一個物件 fh,則fh.breathe()輸出將會是——Fish bubble

假如現在想讓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方法例項化即可。