愿风丶裁尘 2019-02-26 16:25 采纳率: 0%
浏览 542
已采纳

C++中关于类继承的类型转换问题

我的问题是:子类继承基类后,若基类中没有虚函数,都有breathe成员函数的定义这时我定义一个指向基类的指针,同时定义一个子类对象,将这个指针指向子类对象,如:animal是基类,fish是子类

animal* A;fish B;A=&B;A->breathe();

按书上说,是发生了强制类型转换,调用了animal中的breathe(),这个我可以理解;
然后若基类中有虚函数breathe,子类中也有同名定义breathe,再执行上面的代码

animal* A;fish B;A=&B;A->breathe();
可以肯定调用的是fish中的breathe()。是不是同样发生了类型强制转换?那么书上说,实际执行breathe时,会自动根据对象的实际类型调用相应的函数。请问这个实际类型是编译器自动保存的吗?是不是不需要我们做别的操作?
请大佬解惑!谢谢!
附完整代码

#include<stdlib.h>
#include<typeinfo.h>
using namespace std;
class animal
{
public:
    void eat()
    {
        cout<<"animal eat"<<endl;
    }
    void sleep()
    {
        cout<<"animal sleep"<<endl;
    }
    virtual void breath()
    {
        cout<<"animal breath"<<endl;
    }
};
class fish:public animal
{
public:
    void breath()
    {
        cout<<"fish breath"<<endl;
    }
};

void fn(animal *species)
{
    species->breath();
    cout<<typeid(species).name()<<endl;
}
void main()
{
    fish fh;
    animal* fit;
    fit=&fh;
    fn(fit);
    cout<<typeid(fit).name()<<endl;
    //cout<<typeid(fh).name()<<endl;
    system("pause");
}


  • 写回答

1条回答

  • 关注

    你说的强制转换发生在这步:A=&B。所以两个都发生了强制转化
    了解一个名词:虚表。
    c++的的实例都会维护一个虚表,表中的数据就是虚函数的指针,这个表在实例的最前面,你可以通过指针直接访问到这张表。
    有这张表就简单了,如果子类的函数覆盖掉了父类的函数,则子类实例化后的对象中,虚表中的地址就会被子类override的函数的指针给代替
    这样,子类对象在访问这个虚函数时,就会根据这个新的函数地址访问到这个函数了。
    在让你理解一个概念,c++类实例化出的对象中没有函数,只有指向函数的指针。也就是说,一个类实例化出10个对象,然后这10个对象将要调用一个run函数,实际上他们调用的是同一个run函数,他们全部都有指向run函数的指针

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)