网站内部seo,网站策划方案案例,做菠菜网站判多久,阜新网站开发大家好#xff1a; 衷心希望各位点赞。 您的问题请留在评论区#xff0c;我会及时回答。
多态的基本概念
多态是C面向对象三大特性之一#xff08;多态、继承、封装#xff09;
多态分为两类#xff1a;
静态多态#xff1a;函数重载和运算符重载属于静态多态#x…大家好 衷心希望各位点赞。 您的问题请留在评论区我会及时回答。
多态的基本概念
多态是C面向对象三大特性之一多态、继承、封装
多态分为两类
静态多态函数重载和运算符重载属于静态多态复用函数名。
动态多态通过派生类和虚函数实现运行时多态。
静态多态和动态多态的区别
静态多态的函数地址早绑定——编译阶段确定函数地址。
动态多态的函数地址晚绑定——运行阶段确定函数地址。
下面通过案例讲解多态
#include iostream
#include Windows.husing namespace std;class Animal
{
public:void speak(){cout 动物在说话 endl;}
};class Cat : public Animal
{
public:// 重写父类中的函数void speak(){cout 小猫在说话 endl;}
};// 执行说话的函数
void doSpeak(Animal animal)
{animal.speak();
}int main(void)
{Cat cat;doSpeak(cat); // 父类引用接收子类对象system(pause);return 0;
}
运行截图 全局函数doSpeak在编译阶段就确定了它的地址——函数地址早绑定即使形参传入基类Animal的任何子类子类已经重写了基类的speak函数。doSpeak 函数只会调用基类Animal的speak函数。但是我们想执行这行代码doSpeakcat的时候输出“小猫在说话”。即在运行阶段根据函数doSpeak传入的实参类型再去决定具体执行哪个类的成员函数。 如果想要实现“小猫在说话”那么函数地址就不能早绑定必须在程序运行阶段进行绑定即动态多态的函数地址晚绑定——运行阶段确定函数地址。 在父类的成员函数前加上关键字 virtual 使其变成虚函数并且在子类中重写父类的虚函数即可。
#include iostream
#include Windows.husing namespace std;class Animal
{
public:virtual void speak() // 虚函数{cout 动物在说话 endl;}
};class Cat : public Animal
{
public:// 重写父类中的虚函数virtual void speak(){cout 小猫在说话 endl;}
};class Dog : public Animal
{// 重写父类中的虚函数virtual void speak(){cout 小狗在说话 endl;}
};// 执行说话的函数
void doSpeak(Animal animal)
{// 在运行阶段才能确定函数speak()的地址即根据实参类型才能确定执行哪个speak()函数animal.speak();
}int main(void)
{Cat cat;doSpeak(cat); // 调用类Cat的speak()cout ---------- endl;Dog dog;doSpeak(dog); // 调用类Dog的speak()system(pause);return 0;
}
运行截图 实现了在程序运行时根据实参类型决定执行哪一个子类重写的函数。程序执行到doSpeakcat这行代码时编译器检测到实参类型是Cat类就会调用Cat类的speak函数。程序执行到doSpeakdog这行代码时编译器检测到实参类型是Dog类就会调用Dog类的speak函数。 注意子类重写父类的虚函数可以省略 virtual 关键字。
总结
动态满足条件
1、有继承关系
2、子类重写父类的虚函数
函数重写函数首部完全相同函数体不同函数重写发生在子类中。
动态多态的使用
父类的指针或引用接收子类对象调用子类重写的父类函数就会发生动态多态。