网站申请名称和域名,内蒙古住房与建设官方网站,公众号运营策划书,公司网站可以自己建立吗一、多态的基本语法 
多态分为两类 
静态多态: 函数重载 和 运算符重载属于静态多态#xff0c;复用函数名 
动态多态: 派生类和虚函数实现运行时多态 
静态多态和动态多态区别#xff1a; 
静态多态的函数地址早绑定 - 编译阶段确定函数地址 
动态多态的函数地址晚绑定 - 运…一、多态的基本语法 
多态分为两类 
静态多态: 函数重载 和 运算符重载属于静态多态复用函数名 
动态多态: 派生类和虚函数实现运行时多态 
静态多态和动态多态区别 
静态多态的函数地址早绑定 - 编译阶段确定函数地址 
动态多态的函数地址晚绑定 - 运行阶段确定函数地址 
#includeiostream
using namespace std;//多态//动物类
class Animal
{
public://虚函数virtual void speak()//void speak(){cout  动物在说话  endl;}
};//猫类
class Cat :public Animal
{
public://重写函数返回值类型 函数名 参数列表 完全相同称为重写void speak()//子类重写时,前面virtual可写可不写{cout  小猫在说话  endl;}
};//狗类
class Dog :public Animal
{
public:void speak(){cout  小狗在说话  endl;}
};//执行说话的函数
//地址早绑定	在编译阶段确定函数地址
//如果想执行让猫会说话那么这个函数地址就不能提前绑定需要在运行阶段进行绑定地址晚绑定
//在动物类speak函数前加virtual//动态多态满足条件
//1.有继承关系
//2.子类重写父类的虚函数//动态多态使用
//父类的指针或者引用指向子类对象void doSpeak(Animal animal)	//Animal animal  cat
{animal.speak();
}void test1()
{Cat cat;doSpeak(cat);//out:动物在说话 加上virtual之后out:小猫在说话Dog dog;doSpeak(dog);//out:小狗在说话
}int main()
{test1();return 0;
}总结 
多态满足条件 
1.有继承关系 
2.子类重写父类中的虚函数 
多态使用条件 父类指针或引用指向子类对象 
重写函数返回值类型 函数名 参数列表 完全一致称为重写 
二、多态的原理剖析 
1.未发生重写时则为继承把父类中的所有内容都继承一份 2.发生重写时 子类中的虚函数表内部会替换成子类的虚函数地址 多态原理由于写了一个虚函数类的内部发生改变多了一个虚函数(表)指针指向虚函数表表的内部写的是虚函数的函数入口地址当子类重写虚函数时会把自身的虚函数表中的函数替换掉替换成子类的函数当用父类的引用指向子类对象时(上图右下角部分)由于本身创建的时Cat/Dog的子类对象所以调用公共的speak接口时会从子类找函数入口地址确定什么就(Cat/Dog)输出什么(Cat/Dog). 
代码部分只增加了一个测试函数  
#includeiostream
using namespace std;//多态//动物类
class Animal
{
public://虚函数virtual void speak()//void speak(){cout  动物在说话  endl;}
};//猫类
class Cat :public Animal
{
public://重写函数返回值类型 函数名 参数列表 完全相同称为重写void speak()//子类重写时,前面virtual可写可不写{cout  小猫在说话  endl;}
};//狗类
class Dog :public Animal
{
public:void speak(){cout  小狗在说话  endl;}
};//执行说话的函数
//地址早绑定	在编译阶段确定函数地址
//如果想执行让猫会说话那么这个函数地址就不能提前绑定需要在运行阶段进行绑定地址晚绑定
//在动物类speak函数前加virtual//动态多态满足条件
//1.有继承关系
//2.子类重写父类的虚函数//动态多态使用
//父类的指针或者引用指向子类对象void doSpeak(Animal animal)	//Animal animal  cat
{animal.speak();
}void test1()
{Cat cat;doSpeak(cat);//out:动物在说话 加上virtual之后out:小猫在说话Dog dog;doSpeak(dog);//out:小狗在说话
}void test2()
{cout  sizeof Animal    sizeof(Animal)  endl;//未加virtual:1,加上virtual:4
}int main()
{//test1();test2();return 0;
}