12 c++中父类子类对象指针相互转换,成员函数调用方式

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

运行结果:

image

原文链接: https://www.cnblogs.com/haozhou286/p/16349935.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    12 c++中父类子类对象指针相互转换,成员函数调用方式

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/189884

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午3:46
下一篇 2023年2月12日 下午3:48

相关推荐