1、多态
在讨论正题前先了解多态概念。封装、继承、多态是面向对象的三大特性,多态分为两类:
- 静态多态:函数重载和运算符重载属于静态多态,是一种编译时(compile-time)多态,即编译器在编译时就知道调用的是哪一个函数。
- 动态多态:派生类和虚函数实现运行时多态(我们一般说的多态是指动态多态,下文简称多态)。
下面通过一段代码认识一下多态及其基本语法:
class Animal //父类
{
public:
void speak() {
cout << "Animal is speaking" << endl;
}
virtual void run() {
cout << "Animal is runing" << endl;
}
};
class Cat : public Animal //派生类
{
void speak() {
cout << "Cat is speaking" << endl;
}
void run() {
cout << "Cat is runing" << endl;
}
};
int main()
{
Animal* ani = new Cat(); //父类指针指向子类对象
ani->speak(); //Animal is speaking
ani->run(); //Cat is speaking
return 0;
}
动态多态满足条件:
- 有继承关系
- 子类重写父类的虚函数
动态多态使用条件:
- 通过父类的指针或引用调用重写的函数。
2、虚函数
虚函数就是有virtual
关键字修饰的成员函数,就是虚函数。虚函数的目的是为了实现多态。
下面将详细地介绍一下虚函数的实现。如果父类中的函数加了关键字virtual
修饰,那么子类中重写的该函数即使不加virtual
关键字也会默认是虚函数。如果对一下代码不懂,推荐看我的另一篇博客C++类的布局 。
#include<iostream>
using namespace std;
class A {
void fun(){}
};
class B {
virtual void fun() {}
};
int main() {
cout << sizeof(A) << endl; //1
cout << sizeof(B) << endl; //8
return 0;
}
3、纯虚函数
下面时其语法。有纯虚函数的类时抽象类,子类必须实现抽象类的纯虚函数,否则也会被视作纯虚函数。
class Animal {
public:
virtual void functionName() = 0;
};