1. 程式人生 > >父類函式呼叫虛擬函式

父類函式呼叫虛擬函式

http://blog.sina.com.cn/s/blog_466496f30100xp2l.html

rules:

1.如果在父類函式中呼叫父類的虛擬函式,且該虛擬函式在子類中被改寫了,那麼在把子類指標/引用交給父類指標/引用的時候,在呼叫父類中的函式,該函式內的虛擬函式實際上是子類中改寫過的。

#include<stdio.h>
class base
{
 public:
void a()
{
printf("base a\n");
b(1);
};
virtual void b(int x)
{
printf("base b %d \n",x);
};
};

class ext:public base
{
 virtual void b(int x)
{
printf("ext b %d \n",x);
};

};

int main()
{
 ext ext_i;
 base base_i;
 base*  base_p;
 base&  base_r=ext_i;
 base_p=&ext_i;
 base_p->a();
 base_r.a();
 base_i.a();
 return(0);
 
}

result:

[[email protected] ~]$ test43
base a
ext b 1
base a
ext b 1
base a
base b 1


相關推薦

函式呼叫虛擬函式

http://blog.sina.com.cn/s/blog_466496f30100xp2l.html rules: 1.如果在父類函式中呼叫父類的虛擬函式,且該虛擬函式在子類中被改寫了,那麼在把子類指標/引用交給父類指標/引用的時候,在呼叫父類中的函式,該函式內的

C++建構函式與解構函式呼叫虛擬函式的注意事項

雖然可以對虛擬函式進行實呼叫,但程式設計師編寫虛擬函式的本意應該是實現動態聯編。在建構函式中呼叫虛擬函式,函式的入口地址是在編譯時靜態確定的,並未實現虛呼叫。但是為什麼在建構函式中呼叫虛擬函式,實際上沒有發生動態聯編呢? 第一個原因,在概念上,建構函式的工作是

iframe引用頁面在頁面呼叫函式只重新整理子頁面方法

###apache的axis需要的jar <dependency> <groupId>org.apache.axis</groupId> <arti

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

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

C++:為什麼在繼承關係中,的解構函式最好定義為虛擬函式

我們先來看一段簡單程式碼,A類有一個指標成員_pa,B類公有繼承了A類,然後自己有一個指標成員_pb: class A{ public: A(int x = 1) :_pa(new int(x)) {} ~A()

java多個子自動呼叫不包含的函式

問題描述 在用javafx做畢設的時候需要對形狀新增上下文選單。為了程式碼的封裝性,我選擇了新定義一個MyContextMenu繼承ContextMenu。在解決在Shape這種非Controller新增ContexMenu的問題後發現,雖然我能將之前的形狀物

C++中子如何呼叫不同中的同名函式?

  當C++中多繼承時,父類中可能含有同名函式,此時子類如何呼叫呢?    直接貼程式碼: #include <iostream.h> class B1{ public: void output(); }; class B2{ public: void o

解構函式為什麼會自動再呼叫的解構函式

原帖: http://bbs.csdn.net/topics/380022416 裡面的討論基本上已經給出答案了,派生類的解構函式在執行完後,會自動執行基類的解構函式,這個是編譯器強制規定的,沒有為什麼,甚至你在解構函式裡呼叫return都不會立即返回到呼叫處,而是會先按順

一道考察的純虛擬函式定義,靜態變數等C++題目

程式原題如下: #pragma  once class mml { private:static unsigned int x; public:mml(){  x++;  }mml(static unsigned int&){  x++; &

C++通過虛擬函式呼叫虛擬函式

    C++的類如果有虛擬函式,則該類的第一個成員的數值,是一個地址,指向其虛擬函式表。例如     class CTest { public: virtual void Test1(void) { cout<&l

java繼承--子中的建構函式

1 子父類建構函式的特點 在子類構造物件時,發現,訪問子類建構函式時,父類建構函式也運行了。 原因是:在子類的建構函式中第一行有一個預設的隱式語句。 super(); 類似於this(); this();呼叫的是本類的建構函式 子類建構函式預設呼叫的是父類中的空引數建構函式

C++建構函式呼叫虛擬函式是否有多型的效果

C++多型的一個重要應用就是虛擬函式。但是當我們再基類的建構函式中呼叫一個子類過載的虛擬函式會出現多型的效果嗎?我們具體看一下下面的例項: #include <iostream> #define P(x) std::cout<<x<<std::endl;

(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;}

使用純虛擬函式的一個小細節——派生定義該虛擬函式時宣告語句必須與基裡完全一致

純虛擬函式在派生類裡明明補寫出來了定義,但是實際發現是無效的,派生類因沒有定義該純虛擬函式同樣被編譯器視為了抽象類。 原因很有可能是:基類和派生類的虛擬函式必須型別、名字、引數數量、名字、型別、以及函式前後綴的各種其他屬性(比如const等)必須完全一致!否則會被認為不是同

C++物件中虛擬函式與多型性的實現

在面向物件程式設計時,有時會遇到這種需求:我們希望同一個方法在基類和派生類中實現不同的功能,即體現出行為上的多型性。一般有兩種方法可以實現這種需求,其一是在派生類中重新定義基類中方法,其二是使用虛擬函式。這裡主要記錄利用虛擬函式實現多型性的方法。 類中虛擬函式的定義方法 虛擬函式

C++ 繼承靜態變數虛擬函式練習

總時間限制:  1000ms 記憶體限制:  65536kB // 在此處補充你的程式碼 描述 程式碼填空,使得程式能夠自動統計當前各種動物的數量 #include <iostream> using namespace std; void pr

Java子中的建構函式例項化過程

其實我們發現子類繼承父類操作很簡單,如果要是去深入的研究下會發現,例項化過程並非是我們看到的那樣,我們就以程式碼舉例來說明; 問大家,以下程式碼執行會輸出什麼呢? package com.oop; /** * 定義動物物件 * @author

C++建構函式呼叫虛擬函式

談談關於建構函式中呼叫虛擬函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。 測試平臺:VS2013 + Win7X64 一個例子: #include <stdlib.h> #i

在建構函式/解構函式呼叫虛擬函式

先看一段在建構函式中直接呼叫虛擬函式的程式碼: 1 #include <iostream> 2 3 class Base 4 { 5 public: 6 Base() { Foo(); } ///< 列印 1 7 8

C++:11---虛擬函式虛擬函式表、多型、純虛擬函式(抽象、介面)

 介紹虛擬函式之前,先舉一個繼承中的例項 class A { public: void show()const {cout<<"A";}; }; class B:public A //B繼承於A { public: void show()cons