目录
多态概念
多态性是面向对象编程中的一个核心概念,它允许对象通过统一的接口表现出不同的行为。多态性增强了程序的灵活性和可扩展性。
编译时多态(静态多态)
编译时多态,也称为静态多态或早绑定(early binding),是在编译阶段确定调用哪个函数或方法。这主要通过函数重载和模板来实现。
-
函数重载:允许在同一个作用域内定义多个同名函数,但这些函数的参数类型或参数个数必须不同。编译器在编译时根据函数调用时提供的参数类型和数量来确定调用哪个版本的函数。
-
模板:允许程序员编写与类型无关的代码。模板函数或模板类在编译时被实例化,编译器根据提供的类型参数生成具体的函数或类实现。
运行时多态(动态多态)
运行时多态,也称为动态绑定(dynamic binding)或晚绑定(late binding),是在运行时确定调用哪个函数或方法。这主要通过继承和虚函数来实现。
-
继承:允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。子类可以重写基类中的虚函数,从而在运行时表现出不同的行为。
-
虚函数:在基类中声明为
virtual的成员函数。当通过基类指针或引用调用虚函数时,如果指针或引用实际上指向的是派生类对象,那么将调用派生类中重写的虚函数版本。这种机制允许在运行时根据对象的实际类型来确定调用哪个版本的函数。
多态实现
多态需要继承关系,在继承关系下调用同一函数产生不同行为。
class A
{
public:
virtual void P(int a = 0)
{
cout << a << "A" << endl;
}
};
class B :public A
{
public:
virtual void P(int a = 1)
{
cout << a <<"B" << endl;
}
};
void C(A* it)
{
it->P();
}
int main()
{
A a;
B b;
C(&a);
C(&b);
return 0;
}
条件
- 必须是基类的指针或者引用来调用虚函数
- 被调用的必须是虚函数且完成了虚函数的重写与覆盖
如上文给出的对A的virtual void P()是虚函数而且完成了覆写
虚函数
虚函数就是在类成员函数前加virtua修饰(非成员函数不可以加virtual)
class A
{
public:
virtual void P(int a = 0)
{
cout << a << "A" << endl;
}
};
class B :public A
{
public:
virtual void P(int a = 1)
{
cout << a <<"B" << endl;
}
};
虚函数的覆写
虚函数的覆写需要满足
- 派生类和基类拥有完全相同的虚函数(返回值 参数名 参数列表)
但是注意
- 派生类继承基类的虚函数时,你参数列表是完全继承基类的(就括号里面的玩意,就是基类里面是 int i = 10,你派生类里面即使int i = 5也会继承成int i = 10)
还有就是 派生类没有virtual不影响派生类的虚函数,但是基类必须有
class A
{
public:
virtual void P(int a = 0)
{
cout << a << "A" << endl;

最低0.47元/天 解锁文章
1053

被折叠的 条评论
为什么被折叠?



