1. 程式人生 > >怎樣呼叫基類的私有虛擬函式(private virtual function)

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

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

#include <iostream>
using namespace std;

class Base
{
private:
    virtual void f0() { cout << "Base::f0()...." << endl; }
    virtual void f1() { cout << "Base::f1()...." << endl; }
    virtual void f2() { cout << "Base::f2()...." << endl; }
};

class Derive : public Base{};

typedef void(*Fun)(void);

int main(int argc, char* argv[])
{
    Derive d;
    Fun  pFun0 = (Fun)*((int*)*(int*)(&d)+0);
    Fun  pFun1 = (Fun)*((int*)*(int*)(&d)+1);
    Fun  pFun2 = (Fun)*((int*)*(int*)(&d)+2);
    pFun0();
    pFun1();
    pFun2();

    return 0;
}

/*
Output:

Base::f0()....
Base::f1()....
Base::f2()....
*/

相關推薦

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

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

C++虛繼承和虛虛擬函式與繼承

定義:在C++中,在定義公共基類的派生類的時候,如果在繼承方式前使用關鍵字virtual對繼承方式限定,這樣的繼承方式就是虛擬繼承,公共的基類成為虛基類。這樣,在具有公共基類的、使用了虛擬繼承方式的多個派生類的公共派生類中,該基類的成員就只有一份拷貝

解構函式virtual的好處

class Base { public: ~Base(){...} ... }; class Child:public Base { public: ~Child(){...} }; int main() { Child c;

虛擬函式、純虛擬函式的用法及其區別

c程式的記憶體佈局是: 1. 程式碼段 code or text 2. 只讀資料段 ro data 3. 已初始化讀寫資料段 rw data 4. 未初始化讀寫資料段 bss 5. 堆

(C/C++學習筆記)4.C++中的虛擬函式Virtual Table

1 #include <iostream> 2 using namespace std; 3 4 class base 5 { 6 public: 7 virtual void f(){cout<<"base::f()"<<endl;}

cocos2d-x lua 面向物件 ===> 呼叫在派生中已經被過載了的函式

基類: local Base = class("Base", function () return cc.Layer:create() end) function Base:ctor( ... ) end function Base:test(self, ...

解構函式虛擬函式

    基類解構函式為什麼要宣告為虛擬函式?     這個問題是C++理解虛擬函式和動態繫結的一個基礎,也是面試常考的一個點。雖然幾乎每本書中都會提及這個點,但是很少有把其具體闡明。本文通過具體例項+理論闡述儘量清晰解釋這個問題。

(轉載)(C++)淺談多型解構函式宣告為虛擬函式

主要內容: 1、C++類繼承中的建構函式和解構函式 2、C++多型性中的靜態繫結和動態繫結 3、C++多型性中解構函式宣告為虛擬函式 1、C++類繼承中的建構函式和解構函式 在C++的類繼承中, 建立物件時,首先呼叫基類的建構函式,然後在呼叫下一

(C++)淺談多型解構函式宣告為虛擬函式

主要內容: 1、C++類繼承中的建構函式和解構函式 2、C++多型性中的靜態繫結和動態繫結 3、C++多型性中解構函式宣告為虛擬函式 1、C++類繼承中的建構函式和解構函式 在C++的類繼承中, 建立物件時,首先呼叫基類的建構函式,然後在呼叫下一個派生類的建構函式,依次類推; 析構物件時,其

繼承父虛擬函式呼叫

父類:Father 子類:Son 1.  Father* fa=new Son()     例項1: #include<iostream> using namespace std; class Father{ public: Father(){ cou

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

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

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

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

第三十一節 C++ 繼承之如何在派生呼叫被覆蓋的函式成員(方法)

#include <iostream> using namespace std; /*有些基類的方法在派生類被覆蓋,但有時我們需要呼叫基類的方法。 * 這裡提供了兩種方式去呼叫基類被覆蓋的

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

看看下面程式有什麼錯誤: #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:

C++解構函式宣告為虛擬函式

先來看幾段程式例子:1. 將基類解構函式宣告為虛擬函式#include <iostream

當定義和子拷貝建構函式時,需要顯示呼叫的拷貝建構函式才行

寫這個是因為有人提問,正好也就試了。 當基類中“顯示定義了拷貝建構函式和賦值操作符時”當派生類中“顯示定義了拷貝建構函式和賦值操作符時”如果派生類中的拷貝和賦值建構函式中沒有“顯示指定基類的拷貝和賦值建構函式”,即:派生類只是把自己的成員進行了賦值 這時需要手動呼叫基類的

C++派生函式呼叫函式

在MFC的程式中,我們經常會看到下面的程式片段, 片段一: BOOL CClassDlg::OnInitDialog() {        CDialog::OnInitDialog();        //。。。。        //。。。。        AddTr

c#,建構函式筆記

  base()的意思是呼叫基類的建構函式. public DerivedClass() : base()  的意思就是先呼叫基類的建構函式,再呼叫DerivedClass(派生類)的建構函式 base其實最大的使用地方在面相對性開發的多型性上,base可以完成建立派

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

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