愿风丶裁尘 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 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog