父类子类指针相互转换问题 父类子类指针相互转换问题

父类子类指针相互转换问题

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的:

2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;

3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的;

将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;

              当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。

详见以下代码:

 1 #include <iostream>
 2 using namespace std;
 3 class Base {
 4 public:
 5     virtual void f() { cout << "Base::f" << endl; }
 6     virtual void g() { cout << "Base::g" << endl; }
 7             void h() { cout << "Base::h" << endl; }
 8 
 9 };
10 class Derived:public Base
11 {
12 public:
13     virtual void f(){cout<<"Derived::f"<<endl;}
14             void g(){cout<<"Derived::g"<<endl;}
15             void h(){cout<<"Derived::h"<<endl;}
16 };
17 
18 
19 void main()
20 {
21     Base *pB=new Base();
22     cout<<"当基类指针指向基类对象时:"<<endl;
23     pB->f();
24     pB->g();
25     pB->h();
26     cout<<endl;
27 
28     Derived *pD=(Derived*)pB;
29     cout<<"当父类指针被强制转换成子类指针时:"<<endl;
30     pD->f();
31     pD->g();
32     pD->h();
33     cout<<endl;
34 
35     Derived *pd=new Derived();
36     cout<<"当子类指针指向子类时候"<<endl;
37     pd->f();
38     pd->g();
39     pd->h();
40     cout<<endl;
41 
42     Base *pb=(Base *)pd;
43     cout<<"当子类指针被强制转换成父类指针时:"<<endl;
44     pb->f();
45     pb->g();
46     pb->h();
47     cout<<endl;
48 
49     Base *pp=new Derived();
50     cout<<"父类指针指向子类对象时候:"<<endl;
51     pp->f();
52     pp->g();
53     pp->h();
54     cout<<endl;
55 }

执行结果如下图:

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的:

2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;

3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的;

将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;

              当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。

详见以下代码:

 1 #include <iostream>
 2 using namespace std;
 3 class Base {
 4 public:
 5     virtual void f() { cout << "Base::f" << endl; }
 6     virtual void g() { cout << "Base::g" << endl; }
 7             void h() { cout << "Base::h" << endl; }
 8 
 9 };
10 class Derived:public Base
11 {
12 public:
13     virtual void f(){cout<<"Derived::f"<<endl;}
14             void g(){cout<<"Derived::g"<<endl;}
15             void h(){cout<<"Derived::h"<<endl;}
16 };
17 
18 
19 void main()
20 {
21     Base *pB=new Base();
22     cout<<"当基类指针指向基类对象时:"<<endl;
23     pB->f();
24     pB->g();
25     pB->h();
26     cout<<endl;
27 
28     Derived *pD=(Derived*)pB;
29     cout<<"当父类指针被强制转换成子类指针时:"<<endl;
30     pD->f();
31     pD->g();
32     pD->h();
33     cout<<endl;
34 
35     Derived *pd=new Derived();
36     cout<<"当子类指针指向子类时候"<<endl;
37     pd->f();
38     pd->g();
39     pd->h();
40     cout<<endl;
41 
42     Base *pb=(Base *)pd;
43     cout<<"当子类指针被强制转换成父类指针时:"<<endl;
44     pb->f();
45     pb->g();
46     pb->h();
47     cout<<endl;
48 
49     Base *pp=new Derived();
50     cout<<"父类指针指向子类对象时候:"<<endl;
51     pp->f();
52     pp->g();
53     pp->h();
54     cout<<endl;
55 }

执行结果如下图:

猜你喜欢

转载自www.cnblogs.com/mtn007/p/11869945.html