您的位置:首页 > 编程语言 > C语言/C++

C++基础---纯虚函数

2015-09-04 16:12 399 查看

1. 纯虚函数

1.1 纯虚函数的定义

纯虚函数:是一种特殊的虚函数;

纯虚函数的作用:让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义;

纯虚函数的实现:在基类中实现的虚函数的函数原型后加“=0”;

代码示例:

class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
…
};
即:virtual void funtion()=0;


注:一般而言纯虚函数的函数体是缺省的,但是也可以给出纯虚函数的函数体(此时纯虚函数变为虚函数),这一点经常被人们忽视,调用纯虚函数的方法为baseclass::virtual function。

1.2 纯虚函数与抽象类

凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象;

如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法;

1.3 纯虚函数的引入原因

为了方便使用多态特性,我们常常需要在基类中定义虚函数。

在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。

纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。

注:为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;)。若要使派生类为非抽象类,则编译器要求在派生类中,必须对纯虚函数予以重写以实现多态性。同时含有纯虚函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

1.4 纯虚函数的实例

代码示例:

#include <iostream>

using namespace std;

class A
{
public:
A(){}
virtual ~A(){}

public:
virtual void func1() = 0;
};

class B : public A
{
public:
B(){}
virtual ~B(){}

public:
virtual void func1()
{
cout<<"派生类B实现了抽象类A中定义的func1()的操作内容"<<endl;
}
};

class C : public A
{
public:
C(){}
~C(){}

public:
virtual void func1() = 0;
};

class D : public C
{
public:
D(){}
~D(){}

public:
virtual void func1()
{
cout<<"派生类D实现了抽象类C->抽象类A中定义的func1()的操作内容"<<endl;
}
};

int main()
{
cout<<"基类A中定义了纯虚函数virtual void func1() = 0;,因此基类A为抽象类"<<endl;
cout<<endl;

B b;
b.func1();

A *pb = new B;
pb->func1();
delete pb;

cout<<endl;

//C c;
//c.func1();

//A *pc = new C;
//pc->func1();
//delete pc;

cout<<"由于派生类C中没有实现抽象类A的纯虚函数,因此C类仍然是抽象类,无法实例化对象"<<endl;
cout<<"error LNK2001: unresolved external symbol public: virtual void __thiscall C::func1(void) (?func1@C@@UAEXXZ)"<<endl;
cout<<endl;

D d;
d.func1();

A *pd = new D;
pd->func1();
delete pd;

return 0;
}


参考文献:

[1]《C++全方位学习》范磊——第十三章

[2]《C++程序设计教程(第二版)》钱能——第五章、第六章、第七章

[3]《C++ Primer(第5版)》王刚 杨巨峰——第一章、第六章

[4] 百度搜索关键字:C++函数、纯虚函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: