1、多态
1、什么是多态
一种调用函数有多种不同的表现形态。
2、
封装:对信息进行隐藏,对外提供访问限制
继承:代码复用
多态:功能扩展–>在不改变原有代码的基础上进行添加
3、
确认实际调用的函数
1、看指针类型---->Animal *
2、看函数类型---->虚函数virtual void eat()
3、看pa指向对象的函数—>调用pa指向对象的函数 —>程序运行阶段才知道具体调用的执行语句动态联编(晚期绑定)
1、看指针类型---->Animal *
2、看函数类型---->普通函数 void sleep()
3、调用指针类型的函数—>Animal::sleep() —>程序运行前知道具体调用的函数静态联编(早期联编)
4、函数重写---->对虚函数的重定义
函数重定义—>在派生类中函数原型与基类中的函数原型相同的函数
#include <iostream>
using namespace std;
//封装:对信息进行隐藏,对外提供访问限制
//继承:代码复用
//多态:功能扩展-->在不改变原有代码的基础上进行添加
class Animal
{
public:
virtual void eat() //虚函数--->在函数前面加上virtual
{
cout<<"动物吃"<<endl;
}
void sleep()
{
cout<<"动物睡"<<endl;
}
};
class Cat:public Animal
{
public:
void eat() //函数重写---->对虚函数的重定义
{
cout<<"猫吃鱼"<<endl;
}
void sleep() //函数重定义--->在派生类中函数原型与基类中的函数原型相同的函数
{
cout<<"猫睡在沙发上"<<endl;
}
};
class Dog:public Animal
{
public:
void eat() //函数重写---->对虚函数的重定义
{
cout<<"狗吃骨头"<<endl;
}
void sleep()
{
cout<<"狗睡在门口"<<endl;
}
};
void func(Animal *pa)
{
//确认实际调用的函数
//1、看指针类型---->Animal *
//2、看函数类型---->虚函数virtual void eat()
//3、看pa指向对象的函数--->调用pa指向对象的函数 --->程序运行阶段才知道具体调用的执行语句动态联编(晚期绑定)
pa->eat();
//1、看指针类型---->Animal *
//2、看函数类型---->普通函数 void sleep()
//3、调用指针类型的函数--->Animal::sleep() --->程序运行前知道具体调用的函数静态联编(早期联编)
pa->sleep();
}
int main1()
{
Animal a;
Cat c;
Dog d;
func(&a);
cout<<"--------------"<<endl;
func(&c);
cout<<"--------------"<<endl;
func(&d);
cout<<"--------------"<<endl;
return 0;
}
int main()
{
return 0;
}
2、多态实现
1、虚函数指针是分部初始化的,执行到哪个构造函数,就指向哪个构造函数表
2、可以在将函数都设为虚函数,但是效率太低,每次都要从虚函数表中查找,不建议