C 抽象基類

2021-06-28 10:39:30 字數 1638 閱讀 6174

為什麼c++要定義抽象基類?

c++為什麼要定義抽象基類?

抽象類就是類裡定義了純虛成員函式的類。純虛函式只提供了介面,並沒有具體實現。抽象類不能被例項化,通常是作為基類供子類繼承,子類中重寫虛函式,實現具體的介面。

為什麼要定義抽象基類呢?依我所見主要有以下原因:

1.       最重要的原因是,可以將介面與實現分離。介面是軟體產品最有價值的資源,設計介面比實現介面需要耗費更昂貴的成本。因此,要將介面保護起來,以免在針對客戶需求修改實現的時候,程式設計師不小心把介面破壞掉。

2.       引入抽象基類和純虛函式方便實現c++的多型特性。可以用抽象基類的指標去呼叫子類物件的方法。

3.       很多時候,許多基類被例項化是不合理的。例如「形狀」這個基類,被例項化之後反而會讓人相當費解,所以乾脆將「形狀」這個類定義為抽象類,由它派生出正方形,三角形等子類。

c++程式設計——抽象基類

今天無意中看到的一道選擇題,原題如下:

下列有關抽象類和純虛函式的敘述中,錯誤的是 

a)擁有純虛函式的類是抽象類,不能用來定義物件 

b)抽象類的派生類若不實現純虛函式,它也是抽象類 

c)純虛函式的宣告以「=0;」結束 

d)純虛函式都不能有函式體 

關於這題,我敢肯定的是a,b,c都正確,按照排除法d必然是標準答案了。但是,自己印象中貌似d也是對的。實在是記不清楚了,沒辦法,把幾百頁的c++.primer.plus翻出來看,檢視抽象基類那一章節得到如下答案。以下為c++.primer.plus的原文:

c++通過使用純虛函式(pure virtual function)提供未實現的函式。純虛函式宣告的結尾處為=0,參見area()方法:

class baseellipse                    //abstract base class

virtual   ~baseellipse() {}

void    move(int nx, int ny)

virtual   double area() const =0;    //a pure virual function

..... }

當類宣告中包含純虛函式時,則不能建立該類的物件。這裡的理念是,包含純虛函式的類只用作基類。原型中的=0使虛函式成為純虛函式。這裡的方法area()沒有定義,但c++甚至允許純虛函式有定義。例如,也許所有的基類方法都與move()一樣,可以在基類中進行定義,但你仍需要將這個類宣告為抽象的。在這種情況下,可以將原型宣告為虛擬的:

virtual void move(int nx, int ny) = 0;

這將使基類成為抽象的,但你仍可以在實現檔案中提供方法的定義:

void baseellipse::move(int nx, int ny)

總之在原型中使用=0指出類是乙個抽象基類,在類中可以不定義該函式。

總結:抽象類只能作為基類來使用,其純虛函式的實現由派生類給出。如果派生類沒有重新定義純虛函式,而派生類只是繼承基類的純虛函式,則這個派生類仍然還是乙個抽象類。如果派生類中給出了基類純虛函式的實現,則該派生類就不再是抽象類了,它是乙個可以建立物件的具體類了。

這是我的總結:

基類的純虛函式必須有「=0」,但不一定沒有函式的實現,只是不能直接內嵌在類中。

C 學習 抽象基類

抽象基類 abstract base class abc c 提供純虛函式提供未實現的方法,純虛函式宣告的結尾處為 0,例如 class baseellipse virtual baseelipse void move int nx int ny virtual double area const ...

C 抽象基類與虛基類(C primer)

c primer plus p508,抽象基類 c primer plus p556,虛基類 抽象基類是解決如下問題 加入現在需要開發乙個圖形類,表示圓與橢圓 注意,圓是一種特殊的橢圓 所以初步考慮從橢圓類中派生出圓類。但是現在遇到乙個問題,圓與橢圓的面積計算公式不同,所以需要建立乙個abc,抽象出...

C 基礎 抽象基類(ABC)

抽象基類 abc 即abstract base class利用了基類指標指向派生類物件從而呼叫派生類方法的思想實現c 的隱藏 具體實現則主要用到的是純虛函式 pragma once include stdafx.h include include using std cout using std e...