c中如何呼叫基類的虛擬函式,c 中 解構函式中可以呼叫虛擬函式麼

2022-01-01 11:03:18 字數 3310 閱讀 6990

1樓:許詩文

下面是例子:

#include

using namespace std;

class a

a()virtual void f()

}一個類的物件中是沒有關於普通成員函式的指標的slot,只有成員變數還有虛表指標,類的成員函式的**定義在pe檔案的**區,所以從程式載入時,就已經分配好了記憶體用於存放這些**;**執行時所需要的記憶體,比如棧、堆等等,則是**執行時才分配的;對於某個類的所有物件來說,類成員函式只在記憶體中有一份拷貝,所有的物件都共享同一份成員函式的**。同一個類的不同的物件之間的差異僅僅是通過成員變數來體現的。c++實現成員函式的時候實際上用到了一個技巧——this指標。

this指標是當前呼叫成員函式的物件首地址,我們知道通過這個地址可以訪問到對應物件的成員變數。那麼成員函式如何區分this究竟指向哪個物件呢?技巧就在於,c++背後把成員函式當做普通函式一樣呼叫,除了傳入實際的引數外,還把所屬物件的指標作為引數this傳入,函式內部通過顯示的或者隱含的方式訪問物件成員。

2樓:千江月

#include

using namespace std;

class a

3樓:那些年的好溼

b b;宣告一個b物件

然後直接 b.fun();

4樓:匿名使用者

可以, 指明域 就可以了

b b;

b.fun() // 呼叫 b::funb.a::fun(); // 指示呼叫 a::fun

c++基類子類中,虛擬函式究竟是怎樣判斷該呼叫哪個函式的?? 20

5樓:

你問:那麼 p->printf();呼叫的就是子類函式?

原因:由於子類過載了基類的虛擬函式,所以在子類物件的虛擬函式表裡面的函式地址是子類的,而不是父類的,所以p->printf(),肯定呼叫的是子類的printf函式了。

6樓:匿名使用者

有虛擬函式時,每個物件的this指標都指向一個虛擬函式表(virtual table)的地址,這個表裡存的就是虛擬函式的地址。編譯的時候就決定了,普通函式呼叫時直接call這個函式的地址,而是虛擬函式時,是從這個虛表裡取地址去呼叫的。

7樓:只是小小的略懂

如果子類實現了的就掉子類,子類沒實現的就調父類的。

8樓:師大江湖浪子

這就是所謂的多型,請看看c++ primer

9樓:陳

定義了虛擬函式之後,在執行的時候,系統會自動的匹配與之相對應的合適的成員函式。

這裡的話p是指向son的指標,那麼他會先呼叫son裡面的成員函式。

c++ 虛擬函式呼叫

10樓:元初晴

虛擬函式的好處是,你只要有一個基類的指標,就可以根據情況來執行派生類中的函式。

比如你給的程式中,main中只有一個指標, 他是指向基類a的 *p;

但是你注意這裡, p = &b; p->print();

這裡將輸出 20; 及b.setb(20)的結果。

而如果print不是虛擬函式,這裡將輸出 10, 你可以自己試試;

也就是說,我們用基類型別的指標呼叫派生類的函式, 那麼該函式必須為虛擬函式(注意,基類中的虛擬函式將會是派生類中所有相應函式預設為虛擬函式)。否則, 該指標將呼叫基類中的相應函式。

在就題解釋一下, 如題, 如果a中print不是虛擬函式,void main()

好了,這就是虛擬函式, 統一的基類指標,根據其指向物件的型別,相應的選擇函式。 如果你不設成虛擬函式,那就沒這功能。

11樓:匿名使用者

在某基類中宣告為 virtual 並在一個或多個派生類中被重新定 義的成員函式,用法格式為:virtual 函式返回型別 函式名(參數列) ;實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。

例子:#include

using namespace std;

class a

輸出結果:3

12樓:匿名使用者

p=&a;p->printf();//p是父類型別的指標,a是父類的物件,p->printf()呼叫的是父類中的函式。輸出為5

p=&b;p->printf();//p是父類型別的指標,b是子類的物件,p->printf()呼叫的是父類還是子類的函式?要看這個函式是不是虛擬函式,如果是虛擬函式,則呼叫的是子類中的函式;如果不是虛擬函式,呼叫的是父類中的函式。這裡雖然在子類中printf()前沒有加virtual,但它在父類中已宣告為虛擬函式,所以它是虛擬函式。

因而呼叫的是子類中的printf()函式。輸出為20

13樓:漫步輪迴歲月

a a,*p; 宣告瞭一個a類的物件a和一個指向a類的指標pb b; 宣告瞭一個b類的物件b

a.seta(5);b.seta(10); 分別呼叫物件a和物件b的seta函式給變數a賦值

b.setb(20); 呼叫物件b的setb函式給變數b賦值p=&a;p->print(); 將物件a的地址賦給指標p,呼叫a類的print函式, 輸出5

p=&b;p->print(); 將物件b的地址賦給指標p,呼叫b類的print函式,輸出10

c++中 解構函式中可以呼叫虛擬函式麼

14樓:育知同創教育

c++中 析構

函式中不可以呼叫虛擬函式。

effective c++ 中有這樣的描述:同樣的原因也適用於析構過程。一旦派生類解構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c++ 就將它們視為不再存在。

c++中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的解構函式再呼叫基類的建構函式。

假設一個派生類的物件進行析構,首先呼叫了派生類的析構,然後在呼叫基類的析構時,遇到了一個虛擬函式,這個時候有兩種選擇:plan a是編譯器呼叫這個虛擬函式的基類版本,那麼虛擬函式則失去了執行時呼叫正確版本的意義;plan b是編譯器呼叫這個虛擬函式的派生類版本,但是此時物件的派生類部分已經完成析構,「資料成員就被視為未定義的值」,這個函式呼叫會導致未知行為。

15樓:回頭的世界

很簡單,你定義一個虛擬函式,然後在解構函式中呼叫看看,debug除錯,能執行就證明可以!

自己動手比實踐,比問別人「記住」一些規則,更有效果!

16樓:徐霄沛

是可以的,不過,這樣呼叫沒有什麼意義,不能實現多型。

虛擬函式和虛基類的區別是什麼啊,c 中虛擬函式與純虛擬函式的區別是什麼?

虛擬函式 虛基類,它們都和virtual有關,這兩個帶有虛字的定義容易使人混淆,回下面先從作用答 上來解釋這兩個定義的區別 1.虛擬函式是用於多型中virtual修飾父類函式,確保父類指標呼叫子類物件時,執行子類函式的。2 虛基類是用來在多繼承中,如果父類繼承自同一個父類,就只例項化一個父類 說的有...

c中的虛擬函式是什麼,c中虛擬函式與純虛擬函式的區別是什麼?

c 中的虛擬函式是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。c 中的虛擬函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這...

C虛擬函式和純虛擬函式的區別,c中虛擬函式與純虛擬函式的區別是什麼?

虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是 1 純虛擬函式只有定義,沒有實現 而虛擬函式既有定義,也有實現的 純虛擬函式一般沒有 實現部分,如 virtual void print 0 而一般虛擬函式必須要有 的實現部分 c 中 虛擬函式與純虛擬函式的區別是什麼?虛擬函式與純虛擬...