C++學習大綱:純虛函數和抽象類

C++學習大綱:純虛函數和抽象類

C++ 純虛函數和抽象類

1. 純虛函數

定義格式:在函數原型後面加上符號 “=0”

class A

{

...

public:

virtual int f()=0;

}

2. 抽象類

包含純虛函數的類成為抽象類,用於為派生類提供一個基本框架和一個公共的對外接口,派生類(或派生類的派生類...),應對抽象基類的所有純虛成員函數進行實現。(形式上跟Java的抽象類有點像,作用跟Java的接口有點像)

————————————————


C++學習大綱:純虛函數和抽象類

C++ 類(純虛函數和抽象類)

文章概述:

純虛函數和抽象類的基本概念;

抽象類案例;

抽象類在多繼承中的應用以及工程中的多繼承;

多繼承的應用場景

純虛函數和抽象類的基本概念

a. 純虛函數是一個在基類中只有聲明的虛函數,在基類中無定義。要求在任何派生類中都定義自己的版本;

b. 純虛函數為各派生類提供一個公共界面(接口的封裝和設計,軟件的模塊功能劃分);

virtual void func()=0; //純虛函數

d. 一個具有純虛函數的類稱為抽象類。

//抽象類

class A

{

public:

virtual void func() = 0;

};

class B:public A

{

public:

virtual void func()

{

cout << "實現父類的純虛函數" << endl;

}

};

int main()

{

B b;

b.func();

return 0;

}


結論: (1). 抽象類對象不能做函數參數,不能創建對象,不能作為函數返回類型;

A a;(×); //不能創建抽象類的對象

void func(A a);(×) //不能做函數參數

A func(); (×) //不能作為函數的返回值


(2). 可以聲明抽象類指針,可以聲明抽象類的引用;

A * a; (√) //可以聲明抽象類的指針

A & a; (√) //可以聲明抽象類的引用


(3). 子類必須繼承父類的純虛函數才能創建對象。

抽象類案例

//抽象類

class Shape

{

public:

int x, y;

public:

void set(int x, int y)

{

this->x = x;

this->y = y;

}

virtual void S()=0;

};

class Cirle :public Shape

{

public:

void S()

{

cout << "x+y" << x + y << endl;

}

};

class Pirle :public Shape

{

public:

void S()

{

cout << "x-y" << x - y << endl;

}

};

class Dirle :public Shape

{

public:

void S()

{

cout << "x*y" << x * y << endl;

}

};

int main()

{

Shape* p;

Cirle c; c.set(1,2);

Pirle x; x.set(8,6);

Dirle d; d.set(8,5);

p = &c; p->S();

p = &x; p->S();

p = &d; p->S();

return 0;

}


抽象類在多繼承中的應用以及工程中的多繼承

a. 抽象類在多繼承中的應用:C++中沒有接口的概念,抽象類可以模擬接口類(協議:大家應該遵守的一種約定)。

b. 工程中的多繼承:

被實際開發經驗拋棄的多繼承

工程開發中真正意義上的多繼承是幾乎不被使用的

多重繼承帶來的代碼複雜性遠多於其帶來的便利

多重繼承對代碼維護性上的影響是災難性的

在設計方法上,任何多繼承都可以用單繼承代替

多繼承可以解決的問題:

C++學習大綱:純虛函數和抽象類

多繼承解決不了這個問題:

C++學習大綱:純虛函數和抽象類

多繼承的應用場景

a. C++沒有接口的概念,可以使用純虛函數實現接口,接口類中只有函數原型的定義,沒有任何數據的定義。

b. 實際表明: 多繼承接口不會帶來二義性和複雜性等問題;多重繼承可以通過設計好的單繼承和接口代替;接口類只是一個功能說明,不是功能實現;子類需要根據功能說明定義功能的實現。

c. 多繼承—->單繼承+繼承多個接口

class Parent

{

public:

int a;

int b;

};

class InterfaceOne

{

public:

virtual void print()=0;

virtual void sum(int a,int b)=0;

};

class InterfaceTwo

{

public:

virtual void print() = 0;

virtual void jsd(int a,int b) = 0;

};

//子類繼承接口,必須實現其定義

class child:public Parent,public InterfaceOne,public InterfaceTwo //兩個接口中的函數可以重複

{

public:

virtual void print()

{

cout << "子類實現父類的接口" << endl;

}

virtual void sum(int a, int b)

{

cout << "a+b=" << a + b << endl;

}

virtual void jsd(int a, int b)

{

cout << "a-b=" << a - b << endl;

}

};

int main()

{

child c;

c.print();

InterfaceOne* one = &c;

one->sum(4,5);

InterfaceTwo* two = &c;

two->jsd(5,6);

return 0;

}


面向抽象類編程—————–>面向接口編程

————————————————

C++學習大綱:純虛函數和抽象類

通過分享實用的計算機編程語言乾貨,推動中國編程到2025年基本實現普及化,使編程變得全民皆知,最終實現中國編程之崛起,這裡是中國編程2025,感謝大家的支持。

原文鏈接:https://blog.csdn.net/wue1206/article/details/81283280

原文鏈接:https://blog.csdn.net/haitaolang/article/details/70847172


分享到:


相關文章: