对于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对象也不在起作用
不知此推测是否正确,先挂于此处,待能力提高再做验证和分析