1. 程式人生 > >多型是如何實現的

多型是如何實現的

#include <iostream>
using namespace std;
class A
{
public:
	virtual void Func1()
	{
		cout << "class A Func1" << endl;
	}
	virtual void Func2()
	{
		cout << "class A Func2" << endl;
	}
};

class B : public A
{
public:
	virtual void Func1()
	{
		cout << "class B Func1" << endl;
	}
	void Func2()
	{
		cout << "class B Func2" << endl;
	}
	virtual void Func3()
	{
		cout << "class B Func3" << endl;
	}
};

int* GetFuncAddr(void* p, int offer)
{
	int* v_ptrAdrs = *((int**)p);
	return *((int**)v_ptrAdrs + offer);
}

typedef void (*gFUNC)();
void AFunc1Helper(A *p)
{
	//直接呼叫虛擬函式
	(*(gFUNC)GetFuncAddr(p, 0))();
}
//為每一個虛擬函式,實現一個輔助函式,用於指定虛擬函式表中的索引項
void AFunc2Helper(A *p)
{        
	(*(gFUNC)GetFuncAddr(p, 1))();
}

//B類中的虛表列表
void BFunc1Helper(B *p)
{
	(*(gFUNC)GetFuncAddr(p, 0))();
}

void BFunc2Helper(B *p)
{
	(*(gFUNC)GetFuncAddr(p, 1))();
}

void BFunc3Helper(B *p)
{
	(*(gFUNC)GetFuncAddr(p, 2))();
}

int _tmain(int argc, _TCHAR* argv[])
{
	A *pa = new B;
	B *pb = new B;

	//通過這種形式,可以非常清晰的看到多型的實現
	//pa->Func1();
	AFunc1Helper(pa);

	//pa->Func2();
	AFunc2Helper(pa);

	//pb->Func1();
	BFunc1Helper(pb);

	//pb->Func2();
	BFunc2Helper(pb);

	//pb->Func3();
	BFunc3Helper(pb);

	return 0;
}

相關推薦

反射和實現原理詳解

Table of Contents 反射和多型 多型 多型的定義和用法 多型的實現原理 反射 反射的實現原理 反射的應用 反射的弊端 反射和多型 這兩種技術並無直接聯絡,之所以把它們放在一起說,是因為Java提供讓我們在執行時識別物件和類的資訊,主要有

面試題17——簡述實現的原理

編譯器發現一個類中有虛擬函式,便會立即為此類生成虛擬函式表vtable。虛擬函式表的各表項為指向對應虛擬函式的指標。編譯器還會為此類中隱含插入一個指標vptr(對vc編譯器說,它插在類的第一位置上)指向虛擬函式表。呼叫此類的建構函式時,在類的建構函式中,編譯器會隱含執行vptr與vtable

C++繼承實現介面內容封裝例子

        封裝(private中的資料都通過Get與Set來訪問)可以使程式碼模組化,繼承(:)可以擴充套件已存在的程式碼,而多型的目的是為了介面重用(即相同名字的介面可能實現不同的Function功能,因為他們可能可以擴充套件成一個子類)。多型通過

Java繼承和實現例子

繼承,多型的簡單例子 我們想做一個類用於存放CD,DVD等光碟,要應用多型和繼承,去除重複性程式碼,便於以後維護(新增新的格式光碟,如:MP3,MP4),因此我們首先建立一個工程demo,建立datab

淺談C++實現原理(虛繼承的奧祕)

大夥都知道,如果要實現C++的多型,那麼,基類中相應的函式必須被宣告為虛擬函式(或純虛擬函式)。舉個例子: class Point { public: Point(float x = 0.0, float y = 0.0) : _x(x), _y(y) { } virtual fl

C++中動實現之虛擬函式與虛表指標

1、靜多型與命名傾軋,動多型與虛擬函式: (1)概述: 我們知道,C++的多型有靜多型(Static polymorphism)與動多型(Dynamic polymorphism)之分,靜多型是依靠函式過載(function overloading)實現的,

實現原理剖析

1. 虛擬函式表 C++的多型是通過一張虛擬函式表(virtual Table)來實現的,簡稱為V-Table,(這個表是隱式的,不需要關心其生成與釋放)在這個表中,主要是一個類的虛擬函式的地址表,這張表解決了繼承,覆寫的問題,保證其真實反應實際的函式,這樣,在有虛擬函式的類的例項中這個表被分配在了這個例項

C++(實現原理)函式重寫,過載,重定義

多型的實現原理:          首先介紹下函式重寫 重定義 過載的區別; 函式重寫:          發生在父類和子類之間,子類將父類中的同名函式進行了覆蓋,如果在函式前面含有virtual那麼就是重寫,如果沒有就成了覆蓋,子類的同名函式將會覆蓋(隱藏)父類的同名

淺析實現原理

實現過程 當我們在宣告一個類時,編譯器會自動幫我們建立一個虛擬函式表。 比如下面的這段程式碼: 編譯器為我們生成的虛擬函式表 虛擬函式表: 虛擬函式表是由編譯器自動產生的一種儲存類成員函式的一種資料結構。其中虛擬函式會被自動放入表中。 那編譯器是怎

C++實現原理

理論知識: 當類中宣告虛擬函式時,編譯器會在類中生成一個虛擬函式表。 虛擬函式表是一個儲存類成員函式指標的資料結構。 虛擬函式表是由編譯器自動生成與維護的。 virtual成員函式會被編譯器放入虛擬函式表中。 當存在虛擬函式時,每個物件中都有一個指向虛擬函式表的指標

實現的機制

通過上面的的程式碼和兩種不同的形式下的兩種結果我們能夠知道當有virtual關鍵字修飾函式的時候函式是呈現動多型的。p是基類型別的指標,現在指向了派生類,但是在派生類中有兩部分,即派生類自己的部分和繼承基類的部分,此時的p是指向派生類中的基類部分的。所以程式在編譯期間程式拿到的是基類中fun函式的形參x =

JavaScript 繼承 封裝 實現及原理詳解

面向物件的三大特性 封裝 所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不

第5章:介面、實現

介面 介面是軟體資源使用者可用的一組操作 介面中的內容是函式頭和方法頭,以及它們的文件 設計良好的軟體系統會將介面與其實現分隔開來 多型 多型是在兩個或

C++中的動態型別與動態繫結、虛擬函式、執行時實現【轉】

(轉自:https://blog.csdn.net/iicy266/article/details/11906509) 動態型別與靜態型別 靜態型別          是指不需要考慮表示式的執行期語

?它的實現機制是什麼呢?過載和重寫的區別在那裡?這就是這一次我們要回顧的四個十分重要的概念:繼承、、過載和重寫。

什麼是多型?它的實現機制是什麼呢?過載和重寫的區別在那裡?這就是這一次我們要回顧的四個十分重要的概念:繼承、多型、過載和重寫。 繼承(inheritance) 簡單的說,繼承就是在一個現有型別的基礎上,通過增加新的方法或者重定義已有方法(下面會講到,這種方式叫重寫)的方式,產生一個新

C++呼叫實現原理(虛擬函式表詳解)

1.帶有虛擬函式的基類物件模型 我們先看段程式碼: #include<iostream> using namespace std; class B1 { public: void func1() {} int _b; }; class B2 { pub

C#四則運算器(方法實現

在上一節C#課上,我們學習了用類的繼承的方式來做一個四則運算器,然而老師的程式碼在課上演示的效果並不理想,而且沒有使用多型的思想實現,今天我們就來用多型的方式實現四則運算器。   1. 題目及要求         2. Arithmetic類的實現   在

java 筆試 java中實現的機制是什麼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C#(虛方法,抽象,介面實現

轉自   淺談C# 多型的魅力(虛方法,抽象,介面實現) 前言:我們都知道面向物件的三大特性:封裝,繼承,多型。封裝和繼承對於初學者而言比較好理解,但要理解多型,尤其是深入理解,初學者往往存在有很多困惑,為什麼這樣就可以?有時候感覺很不可思

Python:(一個介面多種實現

class Animal(object):----def init(self,name):--------self.name=name def talk(self): pass @staticmethod def animal_talk(obj): #動物叫的介面 obj.talk() c