1. 程式人生 > >C++ 虛擬函式 6-- 三種呼叫虛擬函式的方式比較->通過物件、指標、引用

C++ 虛擬函式 6-- 三種呼叫虛擬函式的方式比較->通過物件、指標、引用

#include <iostream>
#include <string>
using namespace std;
/*---------------------------------
    13-9 三種呼叫虛擬函式的方式比較
---------------------------------*/
class father
{
public:
	virtual void run()const
	{cout<<"父親可以跑一萬米"<<endl;}
};
class son :public father
{
public:
	void run()const
	{cout<<"兒子可以跑十萬米"<<endl;}
};
class daughter :public father
{
public:
	void run()const
	{cout<<"女兒可以跑十萬米"<<endl;}
};
void A(father);  //形參為father類的物件
void B(father*); //形參為father類的指標
void C(father&); //形參為father類的引用
int main()
{
	father *p=0;
	int choice;
	bool quit =false;
	while(1)
	{
		cout<<"0)quit 1)son 2)daughter 3)father: ";
		cin>>choice;
		switch(choice)
		{
		case 0: quit=true;
			break;
		case 1: 
			p = new son;
			A(*p);   //建立子類的物件,將呼叫父類的資訊,因為函式A()是物件呼叫
			break;   //將不會呈現出多型性
		case 2: 
			p = new daughter;
			B(p);
			break;
		case 3: 
			p = new father;
			C(*p);  //取指標運算子的方式取得物件的引用
			break;
		default:
			cout<<"請輸入0到3之間的數字: "<<endl;
		}
		if(true==quit)
			break;
	}
	return 0;
}
void A(father A)  //形參為father類的物件
{                     //由於是用物件的方式來呼叫虛擬函式,那就不會有多型作用
	A.run();          //那麼派生類賦給基類物件,將不會呼叫派生類的同名函式
}
void B(father* B) //形參為father類的指標
{
	B->run();
}
void C(father& C) //形參為father類的引用
{
	C.run();
}



執行結果:

0)quit 1)son 2)daughter 3)father: 1
父親可以跑一萬米
0)quit 1)son 2)daughter 3)father: 2
女兒可以跑十萬米
0)quit 1)son 2)daughter 3)father: 3
父親可以跑一萬米
0)quit 1)son 2)daughter 3)father: 0
Press any key to continue

相關推薦

C++ 虛擬函式 6-- 呼叫虛擬函式方式比較->通過物件指標引用

#include <iostream> #include <string> using namespace std; /*--------------------------------- 13-9 三種呼叫虛擬函式的方式比較 --------

C++ 有參建構函式呼叫方法

class Test { private: int a; int b; public: //帶引數的建構函式 Test(int a) {

JS----直接呼叫函式與call呼叫的區別 (函式呼叫方式介紹)

直接呼叫 直接呼叫函式是最常見 最普通的方式,直接以函式附加的物件作為呼叫者, 在函式後括號內傳入引數來呼叫函式 例如: window.alert("測試程式碼"); 其中呼叫者如果是window可以省略, 即直接alert("測試程式碼"); 以call() 方法

C++】呼叫類的複製建構函式的情況

用類的一個物件初始化同類的另一個物件時。 某函式的返回值是類的物件,呼叫該函式時。 某函式的形參是類的物件,呼叫該函式時。 ※注意區分“初始化”和“賦值”: ClassName c2 = c1;    (初始化語句) ClassName c1 , c2;

C++在多層繼承中呼叫虛擬函式

在一個類中的虛擬函式說明,只對派生類中重定義的函式有影響,對它的基類中的函式不起作用。 例: #include <iostream> usingnamespacestd; class A { public:     void show()  

C++執行時通過基類指標引用呼叫派生類虛擬函式的實現原理: 虛擬函式

我們知道要實現執行時的多型, 必須在基類中宣告和定義相關的虛擬函式, 並在派生類中重新實現基類中的虛擬函式. 當編譯器見到這種繼承層次結構的時候, 編譯器將為定義了虛擬函式的基類和覆蓋了基類虛擬函式的派生類分別建立一張虛擬函式表(Virtual Functi

BlueHost虛擬主機的方案怎麽選

經常在一些主機類的論壇看到不少的網友有這樣的疑問,就是不知道自己該選擇什麽樣的虛擬主機,尤其是現在這種虛擬主機類型繁多的時代。很多主機商為了能夠滿足不同客戶的需求,分別提供了很多不同配置的虛擬主機方案,這樣雖然滿足了很多用戶的不同需求,但是也為部分用戶帶來了麻煩,導致很多新手站長不知道選擇那種虛擬主機好

關於虛擬機的網絡模式設置

ref .cn 外部 ipv4 con 清除 最好 環境 三種 1. 橋接 - 虛擬機作為虛擬的獨立終端,並行於物理機,需要對自身IP進行相關配置(這種網絡模式下,最好有外部路由器。由於和物理主機處於同一個子網內,需要設置相同的IP網段,網關即為路由器IP)。2. NAT

關於虛擬機vmware網絡模式

本地 p地址 dep ade ftp 提供服務 網卡 功能 訪問公網 虛擬機的網絡模式三種1.橋接2.NAT3.Host-OnlyA:橋接專業解釋:橋接網絡是指本地物理網卡和虛擬網卡通過VMnet0虛擬交換機進行橋接,物理網卡和虛擬網卡在拓撲圖上處於同等地位,那麽物理網卡和

nginx 配置虛擬主機的方法

標簽 基於ip地址 dex nginx 配置 root 需要 網站目錄 con 公司 nginx,一個server標簽就是一個虛擬主機。 1、基於域名的虛擬主機,通過域名來區分虛擬主機——應用:外部網站 2、基於端口的虛擬主機,通過端口來區分虛擬主機——應用:公司內部網站,

VM虛擬機的網絡連接模式

進入 技術 參數 station 目前 完成 適配 clas 說過 由於Linux目前很熱門,越來越多的人在學習linux,但是買一臺服務放家裏來學習,實在是很浪費。那麽如何解決這個問題?虛擬機軟件是很好的選擇,常用的虛擬機軟件有vmware workstations和vi

ASP.NET後臺呼叫前臺JS函式常見方法

第一種:使用普通的新增控制元件中的Attributes屬性進行呼叫 例如,像一般的普通的按鈕:Button1.Attributes.Add("onclick","MyFun();"); 此方法只能在Onload中或者類似於onload的初始化過程中新增才有效。並且是先執行指令碼函式,同時

Linux,WWW伺服器配置——虛擬主機的配置方式

Linux,WWW伺服器配置——虛擬主機 Apache伺服器可利用虛擬主機功能在一臺伺服器上設定多個Web站點,Apache支援兩種型別的虛擬主機:基於IP地址的虛擬主機和基於域名的虛擬主機。基於IP地址的各虛擬主機使用同一IP地址的不同埠,或者是使用不同的IP地址。使用者可直接使用

C# 委託的呼叫示例(同步呼叫非同步呼叫非同步回撥)

首先,通過程式碼定義一個委託和下面三個示例將要呼叫的方法: 程式碼如下: public delegate int AddHandler(int a,int b); public class 加法類 { public static int A

c++ STL中sort函式使用方法

複習一下~ STL,C++中的標準模板庫, 使用起來方便並且效率較高; sort函式有三種用法: 一:對基本型別陣列從小到大排序 sort( 陣列名+n1,陣列名+n2); 將陣列中下標從n1到n2的元素進行從小到大排序,不包括n2,通過n1,n2 可以對整

VMware虛擬機器的聯網方法及原理

虛擬機器Vmware網際網路網路應用網路協議 一、Brigde——橋接  :預設使用VMnet0 1、原理: Bridge  橋"就是一個主機,這個機器擁有兩塊網絡卡,分別處於兩個區域網中,同時在"橋"上,執行著程式,讓區域網A中的所有資料包原封不動的流入B,反之亦然。

拷貝建構函式的3呼叫情況分析( C++ )

拷貝建構函式的3種呼叫情況分析 目錄 拷貝建構函式的3種呼叫情況分析 目錄 什麼是拷貝建構函式? 一個物件需要通過另外一個物件進行初始化 一個物件以值傳遞的方式傳入函式

虛擬機器centos連線模式

vmware為我們提供了三種網路工作模式,它們分別是: Bridged(橋接模式)、 NAT(網路地址轉換模式)、 Host-Only(僅主機模式)。 以上三種方式其中nat,host-only經實踐,可正常使用。 1.NAT(網路地址轉換模式)下做如下配置 第一步在centos 6

Js函式建立呼叫

// 函式的三種建立方法 function one(){ // 函式宣告,不屬於任何物件,始終預設為全域性物件 console.log("第一個函式") //預設有一個return this,返回函

建構函式中是否可以呼叫虛擬函式

1. 從語法上講,呼叫完全沒有問題。 2. 但是從效果上看,往往不能達到需要的目的。 Effective 的解釋是: 派生類物件構造期間進入基類的建構函式時,物件型別變成了基類型別,而不是派生類型別。 同樣,進入基類解構函式時,物件也是基類型別。 所以,虛擬函式始終僅僅呼叫