对于c++中的虚函数,在学习虚函数之前,首先需要知道在c++中的多态的含义。
多态的含义:从字面意思上来看就是多种形态,而解释其意思就是,针对一个具体的行为,不同的人(也就是对象)来进行这个行为会有不同的结果,产生不同的状态。
举例说明,几个人干着一样的事情,例如同样干着工作,有的人干工作很快,有的人干的很慢,导致的结果就是有人受到同事的认可,有的人只能处在默默无闻的状态。这里就是不同的对象进行着同样的行为之后,但是产生的状态却不同。
而对于在c++中的多态进行分类:主要分为两种,一种是静态的多态,也可以说是函数的重载,主要就是对于一个同名函数进行重新自定义,例子如下:
int func(int a, int b)
{
return a + b;
}
double func(double a, double b)
{
return a + b;
}
对于同名的函数func中,由于不同的形参构成,返回值也不同,一个是int型,一个是double型,所以两个同名函数构成函数重载。
而另外一种多态则是动态的多态;这里一个就是涉及到父类与子类的继承,使用父类对象的引用或者指针去调用父类和子类中的同名函数,由于父类和子类中的同名函数有各自的定义方法,所以会根据不同类的定义方法产生不同的效果。
例如:定义AClass类,其中有一个输出函数,将其作为父类
class AClass:
{
public:
void qDebugStr();
};
AClass::qDebugStr()
{
qDebug() << "我是A的输出";
}
定义BClass类,也是有一个同名输出函数,继承自AClass,是其子类
class BClass:public AClass { public: void qDebugStr(); }; BClass::qDebugStr() { qDebug() << "我是B的输出"; }
在主函数中使用AClass和BClass类来实例各自的对象,再通过其对象来调用输出函数,就会产生多态效果
BClass B;
AClass &A=B;
AClass *point = &B;
A.qDebugStr();
point->qDebugStr();
B.qDebugStr();
这里一个是使用引用,一个是使用指针,也就是分别使用父类AClass的引用和指针去调用同名输出函数,得到的结果为
我是A的输出
我是A的输出
我是B的输出
这里对于A.qDebugStr(),其只是引用了BClass类的对象,但是还是A类的引用,qDebugStr()仍然是A类的输出函数。而对于使用AClass定义的指针,也仍然是A类的对象,其输出函数也是A的输出函数。所以输出结果也就是如上的结果。
但是如果将AClass中的函数定义使用虚函数进行定义,虚函数定义只在类中的方法前进行虚函数的定义声明。
class AClass:
{
public:
virtual void qDebugStr();
};
AClass::qDebugStr()
{
qDebug() << "我是A的输出";
}
而如上进行虚函数的定义之后,输出结果为
我是B的输出
我是B的输出
我是B的输出
这样输出的原因是,virtual定义之后,调用的qDebugStr()方法使AClass的成员函数还是BClass的成员函数主要是取决于调用这个函数的对象是谁,A和Point所指的对象都是B,所以调用的也就是BClass的成员函数。
通过这里可以看到virtual也就是动态多态的标志,也就是使用基类(父类)的指针或引用指向其派生类对象(子类),能够调用派生类对象(子类对象)当中的同名函数,从而产生多态,也成为动态的多态。