c++中支持两种多态,即:
·编译时多态性(静态多态):通过重载函数实现(函数重载条件:形参的个数或数据类型不同)
·运行时多态性(动态多态):通过虚函数实现
C++产生多态条件
产生多态条件
1 | 指向子类的基类指针 |
2 | 有virtual修饰的函数 |
3 | 通过指针调用相应的虚函数 |
C++多态误区
派生类的函数
屏蔽了与其同名的基类函数
如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆,重载是在同一个类中,而隐藏涉及派生类与基类) |
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆,覆盖有virtual关键字) |
代码实例:
#include<iostream>
using namespace std;
//基类对象
class Base
{
public:
//有virtual关键字,运行时多态
virtual void f(float x)
{
cout<<"Base::f(float)"<< x <<endl;
}
//无viratul关键字,不会发生运行时多态
void g(float x)
{
cout<<"Base::g(float)"<< x <<endl;
}
void h(float x)
{
cout<<"Base::h(float)"<< x <<endl;
}
};
class Derived : public Base
{
public:
virtual void f(float x)
{
cout<<"Derived::f(float)"<< x <<endl; //多态、覆盖
}
//子类与父类的函数同名,无virtual关键字,则为隐藏
void g(int x)
{
cout<<"Derived::g(int)"<< x <<endl; //隐藏
}
void h(float x)
{
cout<<"Derived::h(float)"<< x <<endl; //隐藏
}
};
int main(void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;