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

2022-02-19 06:20:13 字數 3884 閱讀 2477

1樓:匿名使用者

在派生類重新定義或者覆寫基類的過載函式,會導致繼承的名稱被遮掩。

在派生類的 public 區域增加 using base::func; 語句可以解決。

2樓:

你在derive類中的func也加上了virtual導致基類函式被覆蓋,所以肯定錯了

3樓:匿名使用者

大家都說錯了,沒說到重點。

這不是什麼虛函式限制,主要原因在於函式呼叫名稱解釋的問題。按照名稱解析規則,func在類derive中已經找到,所以後續的按引數匹配的名稱查詢會在該類中進行。

這也可以說是乙個c++的值得商討的地方吧,不過更多的,這可以做乙個好的特性來使用,因為它避免了一些有爭議的名稱解析。

你可以這樣指明呼叫關係:d.base::func(1);

derive類中的func關沒有覆蓋基類的虛函式。

思考如下的函式關係,你就會明白我說的爭議的名稱解析是什麼意思了。如果名稱查詢繼續發生在基類,後面的函式會引發二義性。

class base

void func(double c)

};class derive:public base};void main()

4樓:匿名使用者

虛函式的限制

如果宣告了某個成員函式為虛函式,則在該類中不能出現和這個成員函式同名並且返回值、引數個數、型別都相同的非虛函式。在以該類為基類的派生類中,也不能出現這種同名函式。

c++中純虛函式能過載嗎?

5樓:小傑知音

1. 虛函式和純虛函式可以定義在同乙個類(class)中,含有純虛函式的類被稱為抽象類(abstract class),而只含有虛函式的類(class)不能被稱 $

2. 虛函式可以被直接使用,也可以被子類(sub class)過載以後以多型的形式呼叫,而純虛函式必須在子類(sub class)中實現該函式才可以使用 $

只有宣告而沒有定義。

3. 虛函式和純虛函式都可以在子類(sub class)中被過載,以多型的形式被呼叫。

4. 虛函式和純虛函式通常存在於抽象基類(abstract base class -abc)之中,被繼承的子類過載,目的是提供乙個統一的介面。

5. 虛函式的定義形式:virtual

純虛函式的定義形式:virtual = 0;

在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態繫結(run-ti$

以下是簡單的虛函式與純虛函式的使用

#include

using namespace std;

//father class

class virtualbase

6樓:程式猿3號

#include "iostream"

using namespace std;

class a ;

class b : public a

7樓:汐_楓

可以只要它的形參型別不一樣:

如:void f(int a)與void f(char a)是可以同時存在的

請問關於c++虛函式的問題

8樓:黃邦勇帥哥哥

繼承中的指標問題。

1. 指向基類的指標可以指向派生類物件,當基類指標指向派生類物件時,這種指標只能訪問派生物件從基類繼承而來的那些成員,不能訪問子類特有的元素,除非應用強型別轉換,例如有基類b和從b派生的子類d,則b *p;d dd; p=ⅆ是可以的,指標p只能訪問從基類派生而來的成員,不能訪問派生類d特有的成員.因為基類不知道派生類中的這些成員。

2. 不能使派生類指標指向基類物件.

3. 如果派生類中覆蓋了基類中的成員變數或函式,則當宣告乙個基類指標指向派生類物件時,這個基類指標只能訪問基類中的成員變數或函式。例如:基類b和派生類d都定義了函式f,則b *p; d m; p=&m; m.

f()將呼叫基類中的函式f()而不會呼叫派生類中的函式f()。

4. 如果基類指標指向派生類物件,則當對其進行增減運算時,它將指向它所認為的基類的下乙個物件,而不會指向派生類的下乙個物件,因此,應該認為對這種指標進行的增減操作是無效的.

虛函式為什麼要使用虛函式:正如上面第1和3點所講的,當宣告乙個基類指標指向派生類物件時,這個基類指標只能訪問基類中的成員函式,不能訪問派生類中特有的成員變數或函式。如果使用虛函式就能使這個指向派生類物件的基類指標訪問派生類中的成員函式,而不是基類中的成員函式,基於這一點派生類中的這個成員函式就必須和基類中的虛函式的形式完全相同,不然基類指標就找不到派生類中的這個成員函式。

使用虛函式就實現了乙個介面多種方法。

帶預設形參的虛函式:當基類的虛函式帶有預設形參時,則派生類中對基類虛函式的重定義也必須有相同數量的形參,但形參可以有預設值也可以沒有,如果派生類中的形參數量和基類中的不一樣多,則是對基類的虛函式的過載。對虛函式的重定義也就意味著,當用指向派生類的基類指標呼叫該虛函式時就會呼叫基類中的虛函式版本。

比如基類定義virtual void f(int i=1, int j=2){}則派生類中必須定義帶有兩個形參的函式f才是對基類虛函式f的重定義,不然就是函式f的過載版本,比如派生類中定義的void f(),void f(int i),void f(int i=2)都是對函式f的過載,不是對f的重定義。而void f(int i, int j),void f( int i, int j=3),void f(int i=4, int j=5)都是對虛函式f的重定義。

如果虛函式形參有預設值,那麼派生類中的虛數的形參不論有無預設值,當用指標呼叫派生類中的虛函式時就會被基類的預設值覆蓋,即派生類的預設值不起作用。但用派生類的物件呼叫該函式時,就不會出現這種情況。

當用指向派生類的基類指標呼叫虛函式時是以基類中的虛函式的形參為標準的,也就是只要呼叫的形式符合基類中定義的虛函式的標準就行了。比如基類中定義virtual void f(int i=1,int j=2){}派生類中重定義為void f(int i, int j=3){}這時如果用派生類的物件呼叫這個派生類中的虛函式f時必須至少要有乙個實參,但是用指向派生類的基類指標呼叫該虛函式時就可以不用任何形參就能呼叫派生類中的這個函式f,比如語句p->f()就會呼叫派生類中的虛函式版本。當用指向派生類的基類指標呼叫虛函式時是以基類中的虛函式的形參為標準的,也就是只要呼叫的形式符合基類中定義的虛函式的標準就行了。

9樓:匿名使用者

a *ptr = (a *)(&b);用子類b的物件b去給父類的物件指標ptr賦值, 雖然型別是a,但是這個ptr指向的還是b類的物件, 所以回去呼叫b的函式...

我的理解是型別不是關鍵,關鍵是看這個指標指向的物件是哪個類的...

10樓:匿名使用者

這就是c++中乙個很重要的特性,動態繫結,也叫函式覆蓋,英文override.

我空間中寫過這放面的文章,

初步了解可以看

學習c++必須掌握的,

深層次了解可以看下

11樓:匿名使用者

很簡單,即使用a型指標ptr去指向b類物件b,b還是b類物件,在記憶體內的形式是不變的。b還是b類物件,所以b呼叫what方法還是b類的方法。ptr->what也是一樣的。

這裡的物件呼叫的方法看的不是它的引用而是它實際的物件型別。

12樓:匿名使用者

這個&b應該是a的引用吧? 這個挺難的

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

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

c如何在過載函式中呼叫被過載函式

事先宣告過載函式 c 的基本規則 實體在使用前須先宣告。這裡也是一樣,要呼叫過載版本,須先宣告這個過載版本 c 中函式過載有啥用?類的建構函式跟類名相同,即建構函式都同名。如果沒有函式過載機制,要想例項化不同的物件非常麻煩。操作符過載,本質上就是函式過載,它大大豐富了已有操作符的含義,方便使用,例如...

關於C類中帶函式的問題,關於C類中帶函式模板的問題。。

include using namespace std class student class manage int main 大概按照上面的來寫就可以了 大致明白你的意思了。你是想用c 的stl標準的algorithm演算法來排序對吧?如果是這樣,你得自己寫乙個iterator類的東西來處理你的資...