c++:虚函数与纯虚函数
虚函数与纯虚函数的区别:
首先明确:c++中,虚函数的主要作用是构成多态,核心理念就是通过基类访问派生类定义的函数,可以解决代码的歧义;纯虚函数是指被标明为不具体实现的虚函数,是一种特殊的虚函数。
1、纯虚函数是虚函数的一个子集,两者可以定义在同一个类中,含有纯虚函数的类被称为抽象类,不能生成对象;
只含有虚函数的类不能被称为抽象类。
2、虚函数既有定义,也有实现的代码;可以被直接使用,也可以被子类重载以后以多态的形式调用;
纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类只有声明而没有定义。
3、包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。
4、 虚函数和纯虚函数都可以在子类中被重载,以多态的形式被调用。
5、虚函数和纯虚函数通常存在于抽象基类之中,被继承的子类重载,目的是提供一个统一的接口。
6. 对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。
7. 实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。
8. 多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。
C++支持两种多态性:编译时多态性,运行时多态性。
(1)编译时多态性:通过重载函数实现
(2)运行时多态性:通过虚函数实现
虚函数与纯虚函数的用法:
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的形式为:
virtual 函数返回值类型 虚函数名 (形参表)
{
函数体
}
纯虚函数是一种特殊的虚函数,它的一般格式如下:
class <类名>
{
virtual <类型><函数名>(形参表) = 0;
...
}
*为了方便实用多态,编程者常常需要在基类中定义虚拟函数。在很多情况下,基类中不能对虚函数给出有意义的实现,而把它们说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用
举例说明:
虚函数:类中提供虚函数的实现,为子类提供默认的函数实现;子类可以重写父类的虚函数实现子类的特殊化。
如下就是一个父类中的虚函数:
#include<iostream>
using namespace std;
class A
{
public:
void virtual print() //虚函数 为了解决歧义
{
cout<< "AAAAAAAAAAAAAAAA" <<endl;
}
};
class B : public A
{
public:
void print()
{
cout<< "BBBBBBBBBBBBBBBBB" <<endl;
}
};
int main()
{
A *pa = new A;
pa -> print(); //输出A
delete pa;
pa = new B;
pa -> print(); //因为虚函数 所以输出B
return 0;
}
纯虚函数:
(1)C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new来创建对象,实现了这个纯虚函数的子类才能new。
(2)C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。
(3)C++中的纯虚函数也是一种“运行时多态”。
如下面的类包含纯虚函数,就是“抽象类”:
class A
{
public:
virtual void show()=0; //纯虚函数
};
class B : public A
{
public:
void show()
{
cout<<"纯虚函数"<<endl;
}
};
int main()
{
//A *pa=new A; //错误,纯虚函数默认抽象类,不允许创建对象。
B *pb=new B;
pb->show();
return 0;
}