读书人

在编译时的动态联编 遇到的有关问题

发布时间: 2012-03-26 15:46:55 作者: rapoo

在编译时的动态联编 遇到的问题?

C/C++ code
1   #include <iostream>2   using namespace std;3   class A{4   public:5    virtual int get(){return 1;}6   };7   class B:public A{8   public:9    int get(){return 2;}10   };11   int main(void){12    A a;13    B b;14    int one=a.get();15    cout<<"a的值是"<<one<<endl;16    a=b;17    one=a.get();18    cout<<"b的值是"<<one<<endl;19    return 0;20  }

第16行的代码什么意思,怎么解释 ,为什么 第18行代码输出的结果是 1 ?

[解决办法]
a=b 派生类被截断了,并将基类那块内存给a了,所以调用

one=a.get();
cout<<"b的值是"<<one<<endl;

仍然是调用基类的方法。
[解决办法]
a=b,表示把子类对象的值赋给基类,子类的扩展的部分会被丢弃。但你这个例子说明这个问题不太恰当。
你这个例子里,a的类型一直是A,它调用的函数始终是A::get,你给它怎么赋值都是无用。所以当然一直输出的是1。
换成指针就不同了,因为A::get是虚函数,用指针方式访问对象的虚函数时,会尽可能调用该对象的子类函数。。
我给你加几行代码,运行一下看看。
C/C++ code
#include <iostream>using namespace std;class A{        public:                virtual int get(){return 1;}};class B:public A{        public:                int get(){return 2;}};int main(void){        A a;        B b;        int one=a.get();        cout<<"a的值是"<<one<<endl;        a=b;        one=a.get();        cout<<"b的值是"<<one<<endl;        A * a2 = new A();        B * b2 = new B();        int o=a2->get();        cout<<"a2的值是"<<o<<endl;        a2=b2;        o=a2->get();        cout<<"b2的值是"<<o<<endl; //这里应该会输出2.         return 0;} 

读书人网 >C++

热点推荐