好久没有编程了,最近又重新开始学习C++,将学习的总结记录在此......
多态:
父类中的虚函数是以指针(vfptr)-(virtual function pointer)来保存在父类中,vfptr指向虚函数表(vftable),虚函数表中记录着函数的地址,如图所示,
在没有发生重写void voice() 时,子类直接全部继承,
当发生重写时,虚函数表中就会将原本的替换为子类自己的虚函数地址,
所以当我们用父类的指针或者引用来指向子类对象并调用voice()函数时,就会直接调用Dog中的voice()函数了。
小知识:
C++中的override是为了表示当前函数重写了基类中的虚函数,其目的是提高代码可读性,在派生类中提醒自己需要重写这个类,没有重写直接报错。
代码:
#include <iostream>
using namespace std;
class Animal
{
public:
// 虚函数
virtual void voice()
{
cout << "动物叫声!!" << endl;
}
};
class Dog:virtual public Animal
{
public:
void voice() override
{
cout << "汪汪汪!!!" << endl;
}
};
class Cat :virtual public Animal
{
public:
void voice() override
{
cout << "喵喵喵!!!" << endl;
}
};
class DogCat : public Cat, public Dog
{
public:
void voice() override
{
cout << "我该怎么叫!!!" << endl;
}
};
// 如果想要让猫或者狗说话,函数地址就不能早绑定,需要在运行时再进行绑定,需要将函数虚拟化
// 执行说话函数
void speak(Animal& animal)
{
animal.voice();
}
void test01()
{
Cat c;
Dog d;
speak(c); // 输出结果:喵喵喵!!!
speak(d); // 输出结果:汪汪汪!!!
DogCat dc;
speak(dc); // 输出结果:我该怎么叫!!!
}
int main()
{
test01();
system("pause");
return 0;
}