天天看點

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方法執行個體化即可。