/*多态
静态多态:函数重载、运算符重载
动态多态:虚函数
区别:
函数早绑定、晚绑定
*/
#include<iostream>
#include<string>
using namespace std;
/*动态多态 - 虚函数*/
class AnimalCute // 父
{
public:
//void speak()
virtual void speak() // 虚函数
{
cout << "动物在说话" << endl;
}
};
class Cat :public AnimalCute
{
public:
void speak()
{
cout << "小猫在说话" << endl;
}
};
class Dog :public AnimalCute
{
public:
void speak()
{
cout << "小狗在说话" << endl;
}
};
// 地址早绑定,在编译阶段确定函数地址
// 如果要想猫说话,就得地址晚绑定-->虚函数
void doSpeak(AnimalCute &animal) //AnimalCute & animal = cat;强制类型转化
{
animal.speak();
}
void test_33()
{
Cat cat;
doSpeak(cat);
Dog dog;
doSpeak(dog);
}
/*多态的底层原理*/
void test_34()
{
// size of animal 1 函数
// size of animal 4 虚函数
// vfptr 虚函数(表)指针
// v - virtual
// f - function
// ptr- pointer
// vftable 虚函数表
cout << "size of animal " << sizeof(AnimalCute);
}
int main()
{
// 动态多态满足条件:
// -> 继承关系
// -> 子类要重写父类的虚函数
//
// 注意:
// 重载:函数名称相同、参数不同
// 重写:函数名参数完全相同
// 使用:
// 父类的指针或引用去指向子类对象
test_33();/*动态多态 - 虚函数*/
test_34();
}
22-【每天亿点点C++,简单又有趣儿】多态 ----- 这是自由的感觉
猜你喜欢
转载自blog.csdn.net/magic_shuang/article/details/107591596
今日推荐
周排行