不管今天讲啥,我们先来说说重载,重写,重定义的区别:
- 重载:函数名相同,参数列表不相同,返回类型可相同可不相同。
- 重写:也叫覆盖,在不同的作用域中(基类和派生类),函数名相同,参数相同,返回值相同(协变除外),基类函数必须含有virtual关键字。
- 重定义:也叫隐藏,在不同的作用域中(基类和派生类),函数名相同,不是重写就是重定义。
今天,我们来看一下多态。
多态:顾名思义,多种形态。在C++中,多态可以分为静态多态和动态多态。
静态多态
我们在编译阶段就可以知道我们所要调用的是某一个函数。
所以,函数重载就是一种静态多态,为什么说函数重载是一种静态多态呢?
编译器会在编译期间根据函数实参所给出的类型来判断出我们所要调用的是哪一个函数。例如下面这个:
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
动态多态
通俗地讲,就是在程序运行时,才知道我们要调用哪一个函数。 通过基类的指针或者引用指向的对象来确定我们所要调用的是某一个函数。
class Teacher
{
public:
virtual void Func1()
{
cout << "Teacher Func1" << endl;
}
void Func2()
{
cout << "Teacher Func2" << endl;
}
};
class Student:public Teacher
{
public:
virtual void Func1()
{
cout << "Student Func1" << endl;
}
void Func2()
{
cout << "Student Func2" << endl;
}
};
void test(Teacher* t)
{
t->Func1();
t->Func2();
}
构成动态多态的必要条件是:
- 基类必须有虚函数,并且派生类重写基类的虚函数。
- 需要通过基类的指针或者引用来调用虚函数
关于多态的几点总结:
- 基类中含有virtual关键字,派生类中重写的函数也含有virtual属性。
- 只有类中的成员函数才可以定义为虚函数。
- 静态成员函数不可以定义为虚函数。
- 如果在类外定义虚函数,必须将virtual写在函数声明处,不能再类外写virtual。
- 最好把基类的析构函数声明为虚函数。
最后再说一个面试题:
哪些函数不可以做虚函数?
- 友元类函数,因为他不是成员函数。
- 全局函数。
- 静态成员函数,因为他没有this指针。
- 构造函数,拷贝构造函数,赋值运算符重载。