VC 中為什麼要用類 包括派生類,為什麼要派生

2021-08-04 21:39:52 字數 2701 閱讀 4086

1樓:匿名使用者

這個問題說起來挺複雜的,不過值得慶幸的是,在大多數c++語言教材裡,都有明確的闡述,如《the c++ programming language》《c how to program》,建議你看一下。如果不太方便,我也很樂意闡述一下我的理解,因為不想複製網上的,有欺騙樓主的感覺。

舉個例子,建立一個基類:shape,即“圖形類”

類shape裡,含有幾個純虛擬函式,例如draw()用來繪製圖形,故類shape稱為“抽象基類”,因為它不能建立任何物件,類shape實在太過籠統,什麼叫“圖形”?這可太多啦!既然shape不能用來宣告物件,所以他的成員函式,也是純虛擬函式的draw()亦沒有定義!

但是,我們可以從shape派生出類circle、類rectangle……並且在這些新類裡,定義抽象基類shape裡沒有定義的純虛擬函式draw(),之所以現在可以定義,因為circle和rectangle已經是具體的類,他們可以宣告物件,比如前者宣告一個“圓”,後者宣告一個“矩形”,我們當然可以用draw()函式來描繪圓和矩形。

類有結構體所不具備的優點:資訊隔離!只要類的介面不變,不論外界怎麼變,類的內部不受影響;反之亦然!

之所以要派生,這要涉及“多型性”這個概念。簡單說,當程式非常複雜時,我們可能會用指標來操縱類;這時,如果使用一個基類的指標來操縱的話,會容易很多;若結合我開始舉的例子,那就是用shape的指標來操縱circle和rectangle的物件,要好於使用後面兩個派生類的指標操縱他們各自的物件!要問原因,說來話長,還是自己看書吧。

所以,我們既要有基類,也要有派生類。可以簡化程式,易於除錯、改錯。如果你能接觸一些大型複雜的程式,就會感受到c++的類有多麼強大和有用!

2樓:匿名使用者

使用類,可以對程式進去模組化,簡化了程式的複雜程度。

類中封裝了很多功能函式,類可以提供介面去呼叫這些函式。

而類與類之間存在著很多關係,例如:派生類

3樓:匿名使用者

這涉及到的東西很多了,呵呵。我是講不了

這主要是物件導向程式設計和麵向過程程式設計的問題了。

物件導向程式設計應該是程式設計發展的方向吧。

使得程式設計更加自然

c++中基類指標指向派生類時,呼叫的虛擬函式是派生類的,為什麼要這樣啊?

4樓:

直接用子類物件呼叫函式當然沒問題,基類指標指向派生類物件是多型性的體現。

什麼是多型呢?多型就是不同物件接受相同的訊息,但是卻產生不同的行為,舉一個很簡單的例子,有一個圖形類,他有幾個派生類,如圓形,三角形,矩形。圖形類有一個函式area();用來求面積,但是由於不同圖形求面積的方法不同,要由具體的派生類來決定,所以可以把它定義為一個虛擬函式,由派生類來過載這個函式,所以不同的派生類裡面area()函式的函式體是不同的,

建立一個基類指標*p,讓他指向不同的派生類物件,p在呼叫area()方法時,就會呼叫派生類的area()方法了。

多型的一個好處就是提高了**的重用性,如果圖形類又有一個新的派生類五邊形,要求他的面積只需要把剛才的p指標再指向一個五邊形物件,而其他的**無需任何更改!

在附上例子吧!

class shape

class circle: public shape

}class ********: public shape

}class rectangle: public shape

}int main()

只是大概意思,供參考。

5樓:

虛擬函式的作用是: 在呼叫函式時再確定呼叫哪個物件的函式.

如果物件是被初始化為子類的, 就呼叫子類的函式; 如果物件是被初始化為父類的, 就呼叫父類的函式.

6樓:匿名使用者

直接用派生類的物件是可以的。但是虛擬函式的作用體現在多型上。

比如類a是個基類,類b,c,d由類a繼承。

現在我要寫個函式func1,對bcd三個類的物件都通用,函式內部呼叫bcd三個類都有的一個函式func2。

但是bcd三個類是不同的類,那麼這個函式可能就要過載三次,寫成func1(b b);

func1(c c);

func1(d d);

這樣才能區分傳進去的是哪個類的物件在呼叫func2,這樣在繼承得多了的時候顯得很麻煩。虛擬函式多型就可以解決這樣的問題。

把func2在類a中定義成虛擬函式,然後只要寫一個func1func1(a *a);

此時傳b *b,c *c,d *d三個指標物件進去,都可以相應的呼叫各自的func2了。這是物件導向思想的一個體現

c++中為什麼基類中只有帶引數的建構函式時,派生類中一定要顯示定義建構函式,並寫出基類的建構函式及引數

7樓:匿名使用者

因為建立派

抄生類物件時要呼叫基類的bai建構函式,當基類du沒有定義構函式時就調

zhi用預設dao無引數的建構函式。當只定義了有參的建構函式時就呼叫有參的建構函式,所以當派生類沒有給基類傳遞引數時就會出現錯誤。解決方法:

可以在基類中過載一個無參建構函式,或者給有參建構函式的引數設定預設值。

8樓:匿名使用者

當你定義一個派生類抄的物件時首

襲先呼叫的是基類的

建構函式,如基類的建構函式是帶參的 在派生類建構函式的後面會有基類的建構函式的傳參 否則就會報錯 指的是呼叫基類中你定義的這個建構函式而不是預設的無參建構函式

派生類中完全實現基類中所有的的純虛擬函式,否則,派生類也變成了抽象類,不能例項化物件什麼意思

基類中有純虛擬函式,如virtual int fun 0 在派生類中要實現 這個純虛擬函式。如果派生類中沒有實現這個函式,那麼等於派生類中也有了,virtual int fun 0 那麼派生類也變成了抽象類,不能例項化。抽象類 有純函式的類。純虛擬函式就是隻有宣告且 0的 派生類就是它的子類嘛,如果...

派生類中完全實現基類中所有的的純虛擬函式,但還是有錯誤 不能例項化抽象類

還有個純虛的解構函式。個人建議將抽象類的解構函式弄成虛的就行的,沒必要純虛!派生類中完全實現基類中所有的的純虛擬函式,否則,派生類也變成了抽象類,不能例項化物件什麼意思?基類中有純虛擬函式,如virtual int fun 0 在派生類中要實現 這個純虛擬函式。如果派生類中沒有實現這個函式,那麼等於...

在派生類中重新定義虛擬函式時除了面其

d基類中的虛擬函式可以不做任何事的,在派生類中重新定義虛擬函式,即具體操作交給派生類。操作內容 只有操作內容可以不一樣,而引數型別,函式型別,引數個數均要一樣。物件導向程式設計的簡單問題 求解答 以下題目全部單選,錯誤選項已經被我去掉 1.b 2.d 3.a 4.d 5.c 6.b 7.c 8.b ...