對於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對象也不在起作用
不知此推測是否正確,先掛於此處,待能力提高再做驗證和分析