C++动态绑定和模板的简单配合使用(virtual关键字)
来源:互联网 发布:ansys软件怎么用 编辑:程序博客网 时间:2024/06/05 08:36
对于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对象也不在起作用
不知此推测是否正确,先挂于此处,待能力提高再做验证和分析
- C++动态绑定和模板的简单配合使用(virtual关键字)
- 动态绑定和Virtual
- C++ Virtual关键字实现动态绑定
- jQuery on和off配合使用为动态生成的元素绑定监听事件
- virtual关键字的使用
- Retrofit和OkHttp的简单配合使用
- C#.NET 虚方法中中的virtual 和override关键字的使用
- C#.NET 虚方法中中的virtual 和override关键字的使用
- 关于Virtual关键字与动态绑定/牵扯…
- virtual 关键字 继承的使用
- 继承父类使用关键字virtual和new的区别
- 动态绑定和静态绑定的简单理解
- 动态绑定和静态绑定的简单理解
- Virtual函数(动态绑定)
- Obj-C的多态性、动态类型和动态绑定
- Obj-C的多态性、动态类型和动态绑定
- 【C++】静态绑定和动态绑定
- C# 关键字--virtual
- logback 常用配置详解(三) <filter>
- 1
- 分享一個python爬蟲,用來檢測網站可用性
- 神奇的图像处理算法
- js获得屏幕的位置
- C++动态绑定和模板的简单配合使用(virtual关键字)
- cookie和session的使用和区别
- AP作为WLAN用户接入认证点的PEAP用户接入流程
- MFC中的ODBC类
- [iphone]实现单选按钮
- Android service里面启动activity和alertdialog
- typedef void (*Fun) (void)
- jdbc连接sql server 2008
- Mac OS—苹果搭建Android开发环境