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++函数、纯虚函数
相关文章推荐
- C语言排序实例(选择、冒泡、插入、折半、快速)
- C++基础---虚函数
- c++primer之顺序容器(容器库概览)
- C++基础---浅层及深层拷贝构造函数
- 黑马程序员——C语言结构体
- C++基础---构造函数与关键字explicit
- C++基础---构造函数与析构函数
- C++/CLR 使用(VS2012,VS2013,VS2015)编写Windows窗体应用程序
- C语言实现快速排序
- 浅拷贝——C++编译器默认提供的赋值运算符
- C语言实现冒泡排序
- 什么函数不能声明或定义为虚函数
- C语言的总结
- [C++] 模板与泛型编程(2)
- 【more effective c++读书笔记】【第5章】技术(3)——要求(或禁止)对象产生于heap之中
- 【more effective c++读书笔记】【第5章】技术(3)——要求(或禁止)对象产生于heap之中
- c++ 友元类&友元函数
- C++ I/O Stream 控制小数点位数
- 浅拷贝——C++编译器默认提供的拷贝构造函数
- C++中的单例模式