在编译时的动态联编 遇到的问题?
- 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;}