c++多态
多态是c++面向对象三大特性之一
多态分为静态多态和动态多态
。静态多态:函数重载,运算符重载属于静态多态,服用函数名
。动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态区别
。静态多态的函数地址早绑定,编译时确定函数地址
。动态多态的函数地址玩绑定,运行阶段确定函数地址
。虚函数再函数返回类型前叫virtual成为虚函数
virtual void speek();{}
动态多态满足条件
1、有继承关系
2、子类重写父类的虚函数,
重写是指; 函数返回值类型相同 ,函数名函数形参列表相同。
父类中的虚函数virtual关键字不能省略,子类中的可省略。
动态多态的使用
。父类的指针或引用,指向子类对象
void dospeak(animal &animal)
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 class animal //动物类 5 { 6 public: 7 virtual void speak()//前面加上virtual叫虚函数 8 { 9 cout << "动物在说话" << endl; 10 } 11 }; 12 class cat :public animal//猫类 13 { 14 public: 15 void speak()//子类虚函数可以省略virtual 父类虚函数重写 16 { 17 18 cout << "猫在说话" << endl; 19 } 20 21 }; 22 class dog : public animal 23 { 24 public: 25 void speak()//子类虚函数可以省略virtual 父类虚函数重写 26 { 27 cout << "狗在叫" << endl; 28 } 29 }; 30 void dospeak(animal & animal)//多态调用父类指针或引用指向子类对象 31 { 32 animal.speak(); 33 34 } 35 void test() 36 { 37 cat cat; 38 dospeak(cat);//父类可以直接接收子类对象,不需要转换。 39 dog dog; 40 dospeak(dog); 41 } 42 int main() 43 { 44 test(); 45 return 0; 46 }
父类指针或引用 指向子类对象时,发生多态 底层实现
vfptr----+ 虚函数指针 animal cat dog
|
V
vtable anima::speak() cat::speak() dog::speak()
纯虚函数语法
virtual 返回值类型函数名(参数列表)=0;
当类中有了纯虚函数,这个类也叫抽象类
抽象类特点:
。无法实例化对象
。子类必须重写抽象类的纯虚函数,否则属于抽象类

浙公网安备 33010602011771号