C++动态绑定和模板的简单配合使用(virtual关键字)
2013-06-08 17:31
288 查看
对于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对象也不在起作用
不知此推测是否正确,先挂于此处,待能力提高再做验证和分析
下面是对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对象也不在起作用
不知此推测是否正确,先挂于此处,待能力提高再做验证和分析
相关文章推荐
- C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现
- 9.动态生成实体类,根据XML模板使用Emit生成动态类绑定到DataGrid
- C++父类定义虚函数其派生类的同名函数使用virtual关键字吗?
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- C++中的virtual与动态绑定
- 使用C++构建最简单的动态类型系统
- C++ 何时使用动态分配(即使用new关键字)?何时使用指针?
- 简单数据库连接池实现(1)---使用动态代理绑定连接
- 浅谈C++的virtual 动态绑定。
- jQuery on和off配合使用为动态生成的元素绑定监听事件
- C++使用模板实现简单的singleton
- silverlight3 datagrid c#中动态生成模板列(日期格式)使用IValueConvert对绑定数据的格式化操作
- 使用EJS(模板引擎)动态绑定页面中的数据
- C++使用虚函数的时候,子类也要使用virtual关键字吗
- 使用c++开发excel插件 (3.4、编写一个简单的动态链接库)
- C++之类模板最简单的使用
- C++面向对象的动态绑定---虚函数的使用
- 使用C++模板技术实现类的动态注册和获取
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)