請教關於C 中虛基類的問題,請教關於C 中虛基類的乙個問題

2022-11-09 03:01:59 字數 1422 閱讀 8335

1樓:

這是個菱形繼承,菱形繼承即是子類有兩個父類,這兩個父類都繼承自同乙個類。這時候,如果不使用虛基類,定義子類的時候,會生成兩個「祖父」基類的樣本,在呼叫「祖父」基類的成員函式的時候,就會出現「歧義」錯誤,無法編譯通過。解決的辦法就是使用虛基類,這樣就只保留乙個「祖父」基類的樣本,呼叫也不會出現「歧義」了。

如上面例子,不使用虛基類,在「祖父」基類base中定義乙個show1函式,在類c中呼叫就會出現問題:

#include

using namespace std ;

class base

void show1()

};class a: public base

};class b: public base

};class c: public a,public b

};int main()

報錯資訊如下:

error c2385: 'c::show1' is ambiguous

warning c4385: could be the 'show1' in base 'base' of base 'a' of class 'c'

warning c4385: or the 'show1' in base 'base' of base 'b' of class 'c'

改成虛基類就沒問題了。

2樓:

虛基類的作用是:

當你用基類物件的指標或引用呼叫虛函式時,該指標就會依據指標指向的物件(基類指標可以指向派生類物件)來呼叫對應的函式

在你的程式基礎上,如果有:

a a;

b b;

c c;

base *pt[3] = ;

則pt[0]->show();

pt[1]->show();

pt[2]->show();

將分別列印a、b、c三個派生類中的show(); 這樣就能用基類指標靈活的訪問到派生類的函式了,若不加virtual關鍵字,基類指標只能訪問到基類的函式

3樓:匿名使用者

box(double lengthvalue=1.0,double widthvalue=1.0,double heightvalue=1.0);

這只是個函式宣告,沒有函式定義

box(double lvalue,double wvalue,double hvalue):length(lvalue),width(wvalue),height(hvalue){}

此函式的引數列表與上面的相同 所以不構成過載,而是重複定義把上面兩個合成乙個:

box(double lvalue=1.0,double wvalue=1.0,double hvalue=1.

0):length(lvalue),width(wvalue),height(hvalue){}

請教關於c語言的問題高手請進,請教乙個關於c語言的問題。???高手請進!

呵呵呵,你現在編寫的是在命令列介面執行的面向順序執行的程式,你可以內開啟命令提示符輸入你容的程式命令,這樣執行完畢後,就會有結果。你提到網上的程式,這樣的程式是圖形使用者介面的,是物件導向的程式設計,其實程式執行的過程都一樣,只不過是介面改變了,在順序執行的程式上加入了圖形元素。用vc 吧,裡面的m...

c 中抽象類到底有什麼用處,C 中 抽象類和虛基類用途上有什麼區別

提供了做蛋糕的模子和一套流程,至於做出來的蛋糕具體是什麼口味還得由你自己決定,但至少能保證你做出來的是蛋糕而不是麵包或者別的什麼,是共性與個性的統一!抽象類就像是乙個物種類一樣!比如。抽象類就是鳥這個物種。這個鳥是沒有這個動物的。從這個鳥類裡面繼承出來了雞孔雀等。然後虛函式就比方是特徵。比如雞的特徵...

關於c中虛函式過載的問題,C 中純虛函式能過載嗎?

在派生類重新定義或者覆寫基類的過載函式,會導致繼承的名稱被遮掩。在派生類的 public 區域增加 using base func 語句可以解決。你在derive類中的func也加上了virtual導致基類函式被覆蓋,所以肯定錯了 大家都說錯了,沒說到重點。這不是什麼虛函式限制,主要原因在於函式呼叫...