【2013 IGT 笔试题】剪不断理还乱的动态调用关系(继承+多态)

来源:互联网 发布:余额宝委托网络理财 编辑:程序博客网 时间:2024/05/15 09:01
#include <iostream>using namespace std;class A{public:virtual void a(){cout << "A.a()"<<endl;}void b(){cout << "A.b()"<<endl;}};class B : public A{public :void a(){cout << "B.a()" <<endl;}virtual void b(){cout << "B.b()"<<endl;}};class C : public B{public :void a(){cout << "C.a()"<<endl;}void b(){cout << "C.b()"<<endl;}};void main(){A *b = new B();A *c = new C();B *a3 = new C();b->a();//A类指针指向B类对象,并且a为虚函数,所以动态绑定调用的是B.a()b->b();//A类指针指向B类对象,但是b不是虚函数,所以就调用A.b()c->a();//A类指针指向C类对象,并且a为虚函数,所以动态绑定调用的是C.a()c->b();//这里最令人迷惑,A类指针指向C类对象,在A中b不是虚函数,到了B中才是虚函数,那么这个还是调用的A.b()a3->a();//B类指针指向C类对象,继承下来的虚函数a,所以动态绑定,调用的是C.a()a3->b();//B类指针指向C类对象,并且b为虚函数,所以动态绑定,调用的是C.b()cout << sizeof(A) <<endl;//4cout << sizeof(B) <<endl;//4cout << sizeof(C) <<endl;//4//都只包含一个虚指针的大小。}
#include <iostream>using namespace std;struct a{int x:3;int y:4;int z:5;};//4struct b{int x:3;int y:4;int z:5;double c;};//16struct a1{int x:3;int y:4;int z:5;char dd;};//8class c{};//1class d{public:d();virtual ~d();//4void print();private:int x;//4char y;//4};//12int main(){      cout << sizeof(a) <<endl;return 0;}