華清遠見嵌入式學院
講師。首先先請大家來看下面的一段**:
#include
using namespace std;
class shape
;class point:public shape
float gety( ) const
virtual void shapename() const
friend ostream & operator<
protected:
float x,y;
};point::point(float a,float b)
void point::setpoint(float a,float b)
ostream & operator<
本來我的初衷是想定義乙個抽象基類shape,由它派生出5個派生類:circle,square,rectangle,trapezoid,********.這只是其中的一部分,用來說明純虛函式怎樣來使用。但是編譯的時候出現了:
試了很多辦法,解決這段程式的幾個解決途徑:
第一種途徑:
class shape
;並在後面ponit類中新增:
virtual float area() const {}
virtual float volume()const{}
原因:1)因為以後宣告的area() 、volume()、shapename()都是常成員函式,在c++中,const關鍵字是可以被用於參與對過載函式的區分。也就是說:
void shapename()const;
void shapename();
這兩個函式是不一樣的。常物件只能呼叫常方法,而普通物件在宣告同名普通函式的情況下呼叫普通函式,如果沒有宣告同名的普通函式,就會呼叫常方法。
2)純虛函式沒有函式體。對於由shape派生而來的point類來說,因為沒有顯式的去宣告area() 、volume()這兩個沒有用到的函式,導致這兩個函式仍然是純虛函式。而包含純虛函式的類稱為抽象類,抽象類只能作為基類來使用,不能宣告抽象類的物件。那麼這樣就出現了上面報的那個錯誤。
故:所以要讓程式能夠編譯通過,我們要選擇用純虛函式解決問題,就必須在繼承類中對純虛函式進行顯式的宣告和實現。這樣才可以用由抽象類派生而來的派生類來定義物件。
第二種途徑:
class shape
;virtual float volume()const{};
virtual void shapename()const {};
};原因:
我們用虛函式去替代了純虛函式。新增const是為了和point類的const方法同步,都是常成員函式。在本題中,用虛函式去替代了純虛函式,好處就是在後面的point類中不用顯式的再將這幾個沒有給功能的函式再宣告和實現。
虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式。
在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。
故:要讓程式能夠編譯通過,我們要選擇用虛函式,就把這留在後面再重新定義功能的三個函式寫成虛函式的形式。這樣就可以用指向基類指標或引用根據指標指向的物件的類去呼叫指向物件的方法了。
C 虛函式與繼承的乙個例子
通過隱含的this指標,也可以實現執行時多型 include class a int getdata virtual int dogetdata class b public a int dogetdata class c public b int main 這裡列印的結果是1,呼叫的是b中的get...
從乙個例子講解拷貝建構函式與return
1 include iostream 2 using namespace std 34 5class location 613 location const location p 複製建構函式 1417 location 1821 int getx int gety 22private int x,...
從乙個例子說為什麼要用介面
如題,看看下面這個例子 現有狗 和企鵝兩個類 狗會玩飛碟,企鵝會游泳,為什麼要把玩飛碟和游泳的方法分別定義在兩個介面裡?如果 定義在介面反而顯得 更加累贅,因為還多了兩個介面。你可能會想,幹嘛不直接把玩飛碟的方法直接定義在狗類中,游泳 的方法直接定義在企鵝類中 這種情況下沒有父類 假設這樣一種情況 ...