1. 程式人生 > >虛擬函式用作private會怎樣?

虛擬函式用作private會怎樣?

我們都知道虛擬函式的使用要點:

1.在基類方法的宣告中使用關鍵字virtual可使該方法在基類以及所有的派生類中是虛的。2.如果使用指向物件的引用或指標來呼叫虛擬函式,程式將使用為物件型別定義的方法,而不是使用為引用或指標型別定義的方法。這樣基類引用或指標就可以指向派生類物件。3.如果定義的類將被用作基類,則應將那些要在派生類中重新定義的類方法宣告為虛的。

一般這裡說的虛擬函式都是public的,如果虛擬函式用作private呢?看下面一個例子:

#include "stdafx.h"
#include <iostream>

using std::cout;
using std::endl;

class Bclass
{
private:
	virtual void fun() { cout << "Bclass fun is here!" << endl ; }
	void fun2() { cout << "Bclass fun2 is here!" << endl; }
	friend int main();
};

class Dclass : public Bclass
{
public:
	virtual void fun() { cout << "Dclass fun is here!" << endl; }
	void fun2() { cout << "Dclass fun2 is here!" << endl; }
};


int main()
{
	Bclass *pObject = new Dclass();
	pObject->fun();
	pObject->fun2();

	return 0;
}
由執行結果可知,private並不改變多型的性質(注意這裡用到了友元)

相關推薦

虛擬函式用作private怎樣?

我們都知道虛擬函式的使用要點:1.在基類方法的宣告中使用關鍵字virtual可使該方法在基類以及所有的派生類中是虛的。2.如果使用指向物件的引用或指標來呼叫虛擬函式,程式將使用為物件型別定義的方法,而不是使用為引用或指標型別定義的方法。這樣基類引用或指標就可以指向派生類物件

【C/C++】C++之private虛擬函式

一般我們說虛擬函式,它的訪問級別都是public的,用類物件可以直接呼叫,這樣就可以實現執行時的型別繫結,那如果我們將虛擬函式私有化會出現什麼情況呢? 我們先來看一個非虛擬函式私有化的例子 class Base { private: void Prin

怎樣呼叫基類的私有虛擬函式(private virtual function)

原理:如果基類包含虛擬函式,則派生類的物件都會有一個虛擬函式表指標,而且這個指標通常都是處於物件的最前面,即物件的地址和虛擬函式表指標的地址是一樣的。 #include <iostream&g

虛擬函式是否應該被宣告僅為private/protected?

問題匯入 我想對於大家來說,虛擬函式並不能算是個陌生的概念吧。至於怎麼樣使用它,大部分人都會告訴我:通過在子類中重寫(override)基類中的虛擬函式,就可以達到OO中的一個重要特性——多型(polymorphism)。不錯,虛擬函式的作用也正是如此。但如果

父類的虛擬函式宣告為private,是否可以實現多型

大家,先想一想,如果把原來實現多型的父類中virtual函式宣告為private的形式,是否還可以實現多型呢。答案將由下面的程式碼給出。 #include<iostream> using namespace std; class A { private:

(轉)基類解構函式必須為虛擬函式否則造成記憶體洩漏

看看下面程式有什麼錯誤: #include <iostream> using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public

基類解構函式必須為虛擬函式否則造成記憶體洩漏

看看下面程式有什麼錯誤: #include <iostream> using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public Father { publi

關於類的虛擬函式的public,private的繼承問題。

下面的程式碼編譯結果報錯。 test.c: In function `int main(int, char**)': test.c:18:22: error: `virtual void TEST2::testxiongyf()' is private test.c:60:

解構函式為什麼不能宣告為虛擬函式?解構函式為什麼要宣告為虛擬函式

多型中的虛擬函式表是在執行時建立的還是編譯時建立的? 答:虛擬函式表在編譯的時候就確定了,而類物件的虛擬函式指標vptr是在執行階段確定的,這是實現多型的關鍵 (類的函式的呼叫並不是在編譯時就確定的,而是在執行時才確定的,由於編寫程式碼的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以宣告為虛

繼承裡既有虛繼承也有虛擬函式繼承(即既有虛基表,也有虛擬函式表)

對於單一的虛繼承可參考這篇部落格: https://blog.csdn.net/sophia__yu/article/details/82791522 對於有虛擬函式繼承可參考這篇部落格: https://blog.csdn.net/sophia__yu/article/details/82

為什麼建構函式不能夠使虛擬函式

            虛擬函式可謂是C++與其它的面嚮物件語言最大的區別了。虛擬函式的存在使為了多型,Java當然也有多型。不過實現方式並不是通過虛擬函式,我們這裡就不做介紹了。       &

虛擬函式 C++

C++ 虛擬函式 虛擬函式 基類中使用virtual關鍵字宣告的函式,稱為虛擬函式。 虛擬函式的實現,通過虛擬函式表來實現的。即V-table 這個表中有一個類,用於儲存虛擬函式的地址。解決其繼承,覆蓋的問題,用於保證其真實反映的函式。這樣有虛擬函式的例項,將會儲存在這個例項的記憶體中。即用父類的指標,操

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

python也太自動,函式傳遞前判斷是否要‘值傳遞’,而PHP通通‘值傳遞’

一、python ​ # 不可變物件 預設值拷貝 # python裡的值拷貝:把不可變物件所引用的值全部拷貝 # 其它語言的值拷貝:不管你是不是可變不可變,通通給你複製一份 def test_unchanged(a): a+=1 a = 1 test_unchanged(a) prin

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

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

0day 第10章--10.3:覆蓋虛擬函式突破GS

實驗環境:winxp sp3 vs2010 實驗要求:程式要求禁用優化、release版本 實驗原理:程式只有在函式返回時才檢查Security Cookie,如果在函式檢查之前劫持程式流程,就能實現緩衝區溢位了!因此可以利用C++中的虛擬函式!(為什麼?見0day第6章攻擊C++虛擬函

C++物件記憶體模型2 (虛擬函式,虛指標,虛擬函式表)

C++物件記憶體模型2 (虛擬函式,虛指標,虛擬函式表) 從例子入手,考察如下帶有虛擬函式的類的物件記憶體模型: class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1();

C/C++基類的解構函式為什麼必須定義為虛擬函式

C/C++基類的解構函式為什麼必須定義為虛擬函式?   為什麼基類的解構函式是虛擬函式? 在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 (1)第一種情況:沒有多型,建立派生類物件,基類的解構函式不是虛擬函式 #include<

【轉】C++虛擬函式

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