您的位置:首页 > 编程语言 > C语言/C++

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对象也不在起作用

不知此推测是否正确,先挂于此处,待能力提高再做验证和分析

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 C++