c++中父类子类对象指针相互转换的问题:
在面向对象开发时,某些场景下需要将子类对象的指针强转成父类指针进行调用,或者,将父类指针强转成子类指针进行调用,这个时候成员函数调用规律是什么样的?
规律:
不论是上面说的哪种强制转换情况,强转后的指针在调用虚函数时失效
,其他情况正常调用。
理解:
1.子类指针强转成父类指针,使用这个父类指针调用成员函数,本来是应该调用父类自己的成员函数的,但由于子类的同名成员函数为虚函数(父类的对应成员函数标为虚函数了),强转失效了,调用的还是子类的成员函数。
2.父类指针强转成子类指针,使用这个子类指针调用成员函数,本来是应该调用子类自己的成员函数的,但由于父类的同名成员函数为虚函数(子类的对应成员函数标为虚函数了),强转失效了,调用的还是父类的成员函数。
实例
#include <iostream>
using namespace std;
class Father
{
public:
virtual void a() { cout << "Father::a" << endl; }
virtual void b() { cout << "Father::b" << endl; }
void c() { cout << "Father::c" << endl; }
};
class Son:public Father
{
public:
virtual void a(){cout<<"Son::a"<<endl;}
void b(){cout<<"Son::b"<<endl;}
void c(){cout<<"Son::c"<<endl;}
};
int main()
{
Father *pF = NULL;
Son *pS = NULL;
cout<<"当基类指针指向基类对象时:"<<endl; //最普通的情况,父类自己调用自己的成员函数
pF=new Father();
pF->a();
pF->b();
pF->c();
cout<<"当父类指针被强制转换成子类指针时:"<<endl;
pS=(Son *)pF;
pS->a();
pS->b();
pS->c();
cout<<"当子类指针指向子类时候: "<<endl;//最普通的情况,子类自己调用自己的成员函数
pS=new Son();
pS->a();
pS->b();
pS->c();
cout<<"当子类指针被强制转换成父类指针时:"<<endl;
pF=(Father *)pS;
pF->a();
pF->b();
pF->c();
cout<<"父类指针指向子类对象时候:"<<endl;
pF=new Son();
pF->a();
pF->b();
pF->c();
return 0;
}
运行结果:
原文链接: https://www.cnblogs.com/haozhou286/p/16349935.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/189884
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!