1. 程式人生 > >c++虛擬函式的使用方法

c++虛擬函式的使用方法

虛擬函式的使用方法:



(1)在基類用virtual宣告成員函式為虛擬函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便被呼叫。
在類外定義虛擬函式時,不必在定義virtual

 (2)在派生類中重新定義此函式,要求函式名,函式型別,函式引數個數和型別全部與基類的虛擬函式相同,並根據派

生類的需要重新定義函式體。

c++規定,當一個成員函式被宣告為虛擬函式後,其派生類的同名函式都自動成為虛擬函式。因此在派生類重新宣告該

虛擬函式時,可以加virtual,也可以不加,但習慣上一般在每層宣告該函式時都加上virtual,使程式更加清晰。

如果再派生類中沒有對基類的虛擬函式重新定義,則派生類簡單的繼承起基類的虛擬函式。 

 (3)定義一個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。

 (4)通過該指標變數呼叫此虛擬函式,此時呼叫的就是指標變數指向的物件的同名函式。

下面來看一個例子:

#include<iostream>
#include<string>

using namespace std;

class Student
{
	public:
		Student(int , string, float);
		void display();
	protected:
		int num;
		string name;
		float score;	
};
Student::Student(int n, string na, float s)
{
	num=n;
	name=na;
	score=s;
}
void Student::display()
{
	cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<endl;
}
class Graduate:public Student
{
	public:
			Graduate(int , string , float, float);
			void display();

	private:
			float pay;
	
};
Graduate::Graduate(int n, string na, float s, float p):Student(n,na,s),pay(p)
{
}
void Graduate::display()
{
	cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\npay:"<<pay<<endl;
 }
 
int main()
{
	Student stud1(110,"SDL",99.8);
	Graduate grad1(120,"CCT",88.9, 250.5);
	
	Student *p;
	
	p=&stud1;
	cout<<"student:"<<endl;
	p->display();
	p=&grad1;
	cout<<"graduate:"<<endl;
	p->display();
	
	return 0;
} 
輸出的結果為:


此時沒有將任何函式宣告為虛擬函式,所以在Graduate類中diaplay()函式輸出時沒有pay的值,以為p指標是Student類的,本身Student不包括pay資料。

但如果我們想輸出pay的值,只要把Student類中的display函式宣告為虛擬函式即可,只要把它改為virtual void display()宣告為虛擬函式就行,輸出的結果為:


相關推薦

c++虛擬函式的使用方法

虛擬函式的使用方法: (1)在基類用virtual宣告成員函式為虛擬函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便被呼叫。在類外定義虛擬函式時,不必在定義virtual  (2

C++虛擬函式表以及記憶體對齊文章

C++虛擬函式表以及記憶體對齊文章 C++ 物件的記憶體佈局(上) https://blog.csdn.net/haoel/article/details/3081328 C++ 物件的記憶體佈局(下) https://blog.csdn.net/haoel/article/deta

c# 虛擬函式Virtual與重寫override

C#程式碼   using System; namespace Smz.Test { class A { public virtua

【轉】C++虛擬函式

引言 C++中的虛擬函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父類型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有“多種形態”,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的程式碼來實現可變的演算法。比如:模板技術,RTTI技術,虛擬函

C++虛擬函式表在虛繼承和繼承中的差別

下面的程式碼在gcc和VC中的結果 #include <cstdio> class A { public: virtual void funcaa() { printf("class A %s\n",__func__); } }; class AA:virtual pu

C++虛擬函式本質論

C++虛擬函式本質論 13.2.1 多型性原理 1.多型性概念 對多型性最簡單的理解就是一種事物有多種形態。在面向物件設計中,多型性指的是向不同的物件傳送同一訊息時,會產生不同的動作(或行為、功能)。所謂的“向不同的物件傳送同一訊息”,其實就是指呼叫不同物件的某個函式;而“產生不同的動作

C++ 虛擬函式的內部實現

單繼承的情況下 若類有虛擬函式,則在建構函式的時候編譯器會自動為類的例項(物件)在其記憶體的首部(0地址偏移處)增添一個虛擬函式表指標vfptr,指向該類的虛擬函式表。虛擬函式表中會存放該類所有的虛擬函式地址,普通函式則不會被放入其中。如果是子類重寫了父類的虛擬函式,那麼在建立虛擬函

c++虛擬函式(override)和過載函式(overload)的比較

1. 過載函式要求函式有相同的函式名稱,並有不同的引數序列;而虛擬函式則要求完全相同; 2. 過載函式可以是成員函式或友元函式,而虛擬函式只能是成員函式; 3. 過載函式的呼叫是以所傳遞引數的差別作為呼叫不同函式的依據,虛擬函式是根據物件動態型別的不同去呼叫不同

C++ 虛擬函式的兩個例子

1. 第一個例子是朋友告訴我Qt中的某個實現 1 #include <iostream> 2 3 // Qt中的某個實現 4 class A{ 5 public: 6 A() = default; 7 virtual ~A() = default; 8 9 virtua

深入淺出理解c++虛擬函式

    深入淺出理解c++虛擬函式   記得幾個月前看過C++虛擬函式的問題,當時其實就看懂了,最近筆試中遇到了虛擬函式竟然不太確定,所以還是理解的不深刻,所以想通過這篇文章來鞏固下。   裝逼一刻: 最近,本人思想發生了巨

理解C++虛擬函式

1、簡單介紹   C++虛擬函式是定義在基類中的函式,子類可以選擇重寫。在類中宣告(沒有寫函式體的為宣告)虛擬函式的格式如下: virtual void display(); 2、虛擬函式的作用   在使用指向子類物件的基類指標,並呼叫子

C++ 虛擬函式的預設引數問題

前些日子,有個同學問我一個關於虛擬函式的預設引數問題。他是從某個論壇上看到的,但是自己沒想通,便來找我。現在分享一下這個問題。先看一小段程式碼: #include <iostream> using namespace std; class A

C++虛擬函式表(含測試程式碼)

自己搞不懂C++虛擬函式之間的呼叫關係,特地花費一個下午加一個晚上查資料學習,現在把學到的發上來,供大家學習批評; 在此之前感謝這些大佬的部落格等,為我解惑甚多: 1、虛表與虛表指標 C++中的虛擬函式的實現一般是通過虛擬函式表(V-Table)來實

C++ 虛擬函式表解析

1 前言 C++中的虛擬函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有“多種形態”,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的程式碼來實現

C++虛擬函式

2018年11月12日 15:56:57 ChessC 閱讀數:7 個人分類: 一些總結

C++虛擬函式(2)

class x { char *p; public: x(int sz) {p=new char[sz];} virtual ~x(){cout << "~x()\n"; delete []p;} }; class y : public x {

C++ 虛擬函式表指標以及虛擬函式指標的確定

【摘要】 很多教材上都有介紹到虛指標、虛擬函式與虛擬函式表,有的說類物件共享一個虛擬函式表,有的說,一個類物件擁有一個虛擬函式表;還有的說,無論使用者聲明瞭多少個類物件,但是,這個VTABLE虛擬函式表只有一個;也有的在說,每個具有虛擬函式的類的物件裡面都有一

C++ 虛擬函式 筆試題目--綠盟科技

求下面程式的輸出值: class A{ public:  A() {func(0);};  virtual void func(int data) {printf("A1 :%d\n",data);}  virtual void func(int data) const {

c++虛擬函式和虛繼承

1.多繼承可能會出現奇葩現象,多個同樣的變數,導致子類不知道呼叫的那個變數來自哪個父類。2.如果一個外部方法的引數是父類,那麼即使傳了一個子類,在方法中呼叫這個類的內部方法,不管你傳入的是子類還是父類,都會強行給你呼叫父類的方法。因為編譯器認為這樣是安全的,這個方法一定在父類

C++虛擬函式和純虛擬函式和抽象類

1 虛擬函式     虛擬函式是類的一種特殊成員函式,主要是為實現C++的多型特性引入。     虛擬函式之所以“虛”是因為呼叫的虛擬函式不是在靜態編譯(靜態編聯)時確定,而是在執行時通過動態編聯確定的。     多型核心理念即是通過基類訪問派生的子類,通常情況是藉助基類指