关于C++多态问题的整理

来源:互联网 发布:正规淘宝代刷平台app 编辑:程序博客网 时间:2024/06/05 10:22

C++的多态我们可以简单的理解为“一个函数,多种方法”,程序在运行时才会被调用的函数。C++的多态性是通过虚函数来实现的,虚函数允许派生类函数重定义成员函数,而派生类重新定义了基类的虚函数的做法叫做重写成员函数,注意:如果要构成多态,我们首先就必须在派生类里面重写虚函数,然后使用基类类型的指针和引用调用虚函数,只有这样我们才能实现多态。
这里写图片描述

在学习多态这方面的知识时我们最容易弄混淆的就是函数重载、函数的重写、以及函数重定义的区别。
函数重载:首先函数重载是在同一个作用域内进行的,而且函数名不同或者参数不同,如果仅仅只是返回值不同或者函数参数列表的顺序不同这样是不能构成重载的。
这里写图片描述

下面要区分的是函数的重写,函数的重写要求在不同的作用域,一般是在基类和派生类进行重写的,而且能重写的函数在基类里面必须是虚函数,基类里面必须要有Virtual的关键字,同时函数的函数名相同,参数相同,返回值相同。class A
{
public:
A(int a = 0)
:_a(a)
{}
virtual void Dispiay()
{
cout << "A" << endl;
}
int _a;
};
class B : public A
{
B(int b=0)
:A()
, _b(b)
{}
void Dispiay()
{
cout << "B" << endl;
}
int _b;
};
以上就是一个简单的函数重写,这样我们就可以使用基类的引用或者指针对其进调用。
下面我们做一个简单的总结:
1、派生类重写基类的虚函数实现多态,要求函数名,参数列表,函数值完全相同(协变除外)。
2、基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性。
3、只有基类的非静态成员才能定义为虚函数静态成员不能定义为虚函数。
4、构造函数不能定义为虚函数,只能在声明函数时加上virtual关键字,定义时不用加。
5、构造函数不能定义为虚函数(因为构造函数没有this指针),同理拷贝构造函数也不能定义为虚函数,operator=一般也不要定义为虚函数(operator=函数在一些编译器下规定不能为虚函数,一些编译器下规定operator=函数不能被继承),使用的时候容易混淆。
6、不要在构造函数和解析函数中调用虚函数,在构造函数和析构函数中,对象是不够完整的,可能会出现未定义的行为。
7、最好将基类的解析函数声明为虚函数。
8、虚表是所有类对象公用的。