C++動態綁定和模板的簡單配合使用(virtual關鍵字)

對於C++新人來說,virtual就能把我們搞的一頭霧水,就更別提牛B閃閃、功能如霸王龍般強大的模板了,有的事情從簡單着手,未必不是一個好的策略!

下面是對virtual和template的簡單使用

#include<iostream>
using namespace std;
class A {
public:
virtual  void printPrice(string _string){
        cout<<"the price is A"<<endl;
}

};
class B : public A {
public:
        void printPrice(string _string){
                cout<<"the price is B"<<endl;
        }

};
template<typename T>
class D {
public:
        void print(T &t){

                t.printPrice("A");
        }

};

int main(){

     A a;
    B b;
    D <A>d;
    d.print(b);
    return 0;
}

A類中的printPrice()函數定義爲虛函數,是爲了聲明該函數在派生類中是要被重寫的,如果利用派生類的對象來調用printPrice()函數,首先要執行的不是基類中的該函數,而是派生類B類中的,main函數中說明的就是這一點。

D類的實例化對象是按A類爲模板實例化的,按照常理d.print(b)應該是要報錯的,但程序執行了B::printPrice(),說明virtual改變了指向,去調用重寫的函數

如果去掉virtual關鍵字,再這樣是否就會報錯了呢?答案是:no 結果是調用了A::printPrice()這一點讓我很困惑!!!!!!!!

難道是因爲這??????

分析如下:(1)加上virtual關鍵字後,程序再編譯時發現virtual,變指定在運行時綁定,雖然d是以A爲模板實例化的對象,但裏面的t.printPrice("A")在編譯的時候並沒有替換爲a.printPrice("A"),而是在運行的時候,發現d.print(b)函數的形參是b對像,則自動綁定b.printPrice("A");

       (2)當把virtual關鍵字去掉以後,在編譯時便把模板中的T替換爲A,t.printPrice("A")也在編譯時根據D <A>d 替換爲a.printPrice("A"),而運行時d.print(b)指定形參爲b對象也不在起作用

不知此推測是否正確,先掛於此處,待能力提高再做驗證和分析

 

發佈了26 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章