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


0

1个回答

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

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!