首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-26 
在编译时的动态联编 遇到的问题?C/C++ code1#include iostream2using namespace std3class A{4public:5

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

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;} 

热点排行