什麼是虛函數?

General 更新 2023年10月15日

什麼是虛函數?

可以讓成員函數操作一般化,用基類的指針指向不同的派生類的對象時,

基類指針調用其虛成員函數,則會調用其真正指向對象的成員函數,

而不是基類中定義的成員函數(只要派生類改寫了該成員函數)。

若不是虛函數,則不管基類指針指向的哪個派生類龔象,調用時都

會調用基類中定義的那個函數。

class A

{

virtual void AAA()

{

cout<<"這是基類的!";

}

};

class a:A

{

void AAA()

{

cout<<"這是派生類a!";

}

};

然後你生成a的實例,調用AAA()方法時,程序調用的是a中的AAA,而不是A中的AAA

如果你不定義virtual,在生成a的實例後調用的是基類的AAA()

c++中的虛函數是什麼東西?

在類中使用關鍵詞virtual修飾的為虛函數,如

class ob

{

virtual void func(){;}

}

虛函數的主要作用是在派生類與基礎之間產生多態性.通俗一點講.一個類的函數被說明為虛函數,然後他派生下去的類繼承過來的這個函數也同時默認為虛函數,當使用一個基類的指針指向一個子類的對象地,那麼使用該指針調用的函數將會是所指向對象的函數.舉例

class ob1

{

virtual int func(){return 1;}

}

class ob2:public ob1

{

int func(){return 2;}

}

ob2派生自ob1.ob1有一個func的虛函數.ob2同時繼承了這個函數.並且改寫了它.ob2中的func函數自動成為虛函數.此時我們使用

ob1 *P=new ob2; 使用了一個ob1的指針指向的是ob2的對象.這時p->func;所調用的是ob2的func函數,

注意:一般情況下我們會在這種派生中將基類的析構函數也說明為虛函數如

virtual ~ob1(){;}

這樣,他派生的子類的析構函數同時默認為虛析構函數.這樣在刪除一個指向子類的對象的基類指針時,就會調用指針所指向的類的析構函數.如

delete p;刪除的是基類指針,但是p指向的是子類ob2所以虛函數正常的引導先調用耽類ob2的析構函數.

另外:構造函數是不能被說明為虛函數的

虛函數是什麼意思

在某基類中聲明為 virtual 並在一個或多個派生類中被重新定 義的成員函數,virtual 函數返回類型 函數名(參數表) {函數體;},實現多態性,通過指向派生類的基類指針或引用,訪問派生類中同名覆蓋成員函數

虛函數有什麼作用

虛函數的作用

2009-02-09 10:44:14

在面向對象的C++語言中,虛函數(virtual function)是一個非常重要的概念。因為它充分體現了面向對象思想中的繼承和多態性這兩大特性,在C++語言裡應用極廣。比如在微軟的MFC類庫中,你會發現很多函數都有virtual關鍵字,也就是說,它們都是虛函數。難怪有人甚至稱虛函數是C++語言的精髓。

那麼,什麼是虛函數呢,我們先來看看微軟的解釋:

虛函數是指一個類中你希望重載的成員函數,當你用一個基類指針或引用指向一個繼承類對象的時候,你調用一個虛函數,實際調用的是繼承類的版本。

——摘自MSDN

這個定義說得不是很明白。MSDN中還給出了一個例子,但是它的例子也並不能很好的說明問題。我們自己編寫這樣一個例子:

#i nclude "stdio.h"

#i nclude "conio.h"

class Parent

{

public:

char data[20];

void Function1();

virtual void Function2(); // 這裡聲明Function2是虛函數

}parent;

void Parent::Function1()

{

printf("This is parent,function1\n");

}

void Parent::Function2()

{

printf("This is parent,function2\n");

}

class Child:public Parent

{

void Function1();

void Function2();

} child;

void Child::Function1()

{

printf("This is child,function1\n");

}

void Child::Function2()

{

printf("This is child,function2\n");

}

int main(int argc, char* argv[])

{

Parent *p; // 定義一個基類指針

if(_getch()=='c') // 如果輸入一個小寫字母c

p=&child; // 指向繼承類對象

else

p=&parent; // 否則指向基類對象

p->Function1(); // 這裡在編譯時會直接給出Parent::Function1()的

入口地址。

p->Function2(); // 注意這裡,執行的是哪一個Function2?

return 0;

}

用任意版本的Visual C++或Borland C++編譯並運行,輸入一個小寫字母c,得到下面的結果:

This is parent,function1

This is child,function2

為什麼會有第一行的結果呢?因為我們是用一個Parent類的指針調用函數Fuction1(),雖然實際上這個指針指向的是Child類的對象,但編......

c++中什麼是實函數 什麼是虛函數

在父類裡使用virtual關鍵字來修飾成員函數,這樣的函數稱之為虛函數。其作用主要用於子類覆蓋父類的同名方法。然後通過基類指針或引用來訪問派生類或基類的同名方法。同時用虛函數可以實現OOP裡的多態機制。

下面的示例是利用虛函數實現OOP裡的多態機制:

#include using namespace std;class Parent{public:Parent(){}virtual void Foo(){cout << "default for parent." << endl;}~Parent(){};private:};class Chlid :public Parent{public:Chlid(){}// 重寫父類的同名方法Foo void Foo(){cout << "default for child." << endl;}private:};class Chlid2 :public Parent{public:Chlid2(){}// 重寫父類的同名方法Foovoid Foo(){cout << "default for child2." << endl;}private:};int main(int argc, char* argv[]){// 實現C++裡的多態機制Parent *parent[2];parent[0]=new Chlid();parent[1] = new Chlid2();for (int i = 0; i < 2; i++){parent[i]->Foo();}return 0;}

另外,沒聽說過C++有實函數這一概念。

在C++中用虛函數的作用是什麼?為什麼要用到虛函數

虛函數聯繫到多態,多態聯繫到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。

下面是對C++的虛函數這玩意兒的理解。

一, 什麼是虛函數(如果不知道虛函數為何物,但有急切的想知道,那你就應該從這裡開始)

簡單地說,那些被virtual關鍵字修飾的成員函數,就是虛函數。虛函數的作用,用專業術語來解釋就是實現多態性(Polymorphism),多態性是將接口與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。下面來看一段簡單的代碼

class A{

public:

void print(){ cout<<”This is A”<

};

class B:public A{

public:

void print(){ cout<<”This is B”<

};

int main(){ //為了在以後便於區分,我這段main()代碼叫做main1

A a;

B b;

a.print();

b.print();

}

通過class A和class B的print()這個接口,可以看出這兩個class因個體的差異而採用了不同的策略,輸出的結果也是我們預料中的,分別是This is A和This is B。但這是否真正做到了多態性呢?No,多態還有個關鍵之處就是一切用指向基類的指針或引用來操作對象。那現在就把main()處的代碼改一改。

int main(){ //main2

A a;

B b;

A* p1=&a;

A* p2=&b;

p1->print();

p2->print();

}

運行一下看看結果,喲呵,驀然回首,結果卻是兩個This is A。問題來了,p2明明指向的是class B的對象但卻是調用的class A的print()函數,這不是我們所期望的結果,那麼解決這個問題就需要用到虛函數

class A{

public:

virtual void print(){ cout<<”This is A”<

};

class B:public A{

public:

void print(){ cout<<”This is B”<

};

毫無疑問,class A的成員函數print()已經成了虛函數,那麼class B的print()成了虛函數了嗎?回答是Yes,我們只需在把基類的成員函數設為virtual,其派生類的相應的函數也會自動變為虛函數。所以,class B的print()也成了虛函數。那麼對於在派生類的相應函數前是否需要用virtual關鍵字修飾,那就是你自己的問題了。

現在重新運行main2的代碼,這樣輸出的結果就是This is A和This is B了。

現在來消化一下,我作個簡單的總結,指向基類的指針在操作它的多態類對象時,會根據不同的類對象,調用其相應的函數,這個函數就是虛函數。

二, 虛函數是如何做到的(如果你沒有看過《Inside The C++ Object Model》這本書,但又急切想知道,那你就應該從這裡開始)

虛函數是如何做到因對象的不同而調用其相應的函數的呢?現在我們就來剖析虛函數......

c++中的虛函數有什麼作用?

virtual 關鍵詞可以將一個類的函數說明為虛函數

虛函數的主要用處是對派生類實現動態聯編.舉例說明一下:

class a

{

virtual int func(){return 1;}

}

class b:public a

{

int func(){return 2;}

}

void main()

{

a *p;

p=new b;

p->func();//得到的結果是2.

}

由上面簡單的例子可知,一個基類的指針可以指向他的子類,使用該指針調用函數時,如果調用的函數在基類中被說明為虛函數,那麼子類中該函數也自動成為虛函數,調用時會根據指針所指向的對象調用相應類的虛函數.實現動態聯編範

更詳細的說明你可以看一下虛函數表

什麼是c++虛函數,虛函數的作用和使用方法

當一個基類或虛基類派生了多個子類時,並且這些子類都重寫了基類的一個虛函數,那麼當你創建了多個子類對象時,可以把這些對象組成一個基類數組,通過類基對象或基類對象指針可以調用同一個函數名而執行的是不同的子類的函數,這就是虛函數最根本的用途,這是一個後期綁定機制,在編譯前,對象的類型是不可知的。在編譯時才確定對象的類型,從而調用合適的函數。

class A

{

public:

A();

void f1();

virtual void f2();

virtual void f3()=0;

virtual ~A();

};

class B : public A

{

public:

B();

void f1();

void f2();

void f3();

virtual ~B();

};

int main(int argc, char* argv[])

{

A *m_j=new B();

m_j->f1();

m_j->f2();

m_j->f3();

delete m_j;

return 0;

}

C++裡虛函數是幹什麼用的

有了虛函數,就可以實現通過基類的指針或者基類的引用調用到派生類的函數,這個太強大了。

也就是把通過基類的指針或者引用調用虛函數的代碼寫在那裡不動,將來你新寫了派生類並實現了虛函數,那些本來的代碼就能調用到你新寫的虛函數。

很多軟件的插件就是通過虛函數的機理在工作,因為寫軟件的並不知道人家新的插件可以幹啥,但是卻需要調用到新的插件的函數。

什麼是虛函數和純虛函數,有什麼區別

虛函數是在基類中作總體框架定義,定義時在函數的返回類型名前加上virtual構成。它的具體不同實現版本是在其類的派生類裡實現的。純虛函數是在其類中連基本框架都定義不出來,所以只是用“virtual 類型名 函數名()=0;”的形式來聲明基類中有這麼一個函數,而它的實現則完全由基類的派生類根據不同需要來完成。有純虛函數的基類叫抽象類,不能被實例化(即不能生成對象),只能被繼承。我的理解是:虛函數實現的具體版本中總是有通用的部分,這些通用部分可以在基類中定義,而純虛函數則完全沒有能共用的部分,完全是由派生類中不同的實現完成的。供參考……

相關問題答案
什麼是虛函數?
什麼是奇函數和偶函數?
什麼是虛數?
什麼是保函保證金賬戶?
什麼是有效數?
什麼是虛擬現實?
什麼時候函數不可導?
什麼是個人數字證書?
什麼是線性數據結構?
什麼是平均數和標準差?