基本概念
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本
纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分)
纯虚函数的语法
virtual 类型 函数名(参数表) = 0;
一个具有纯虚函数的基类称为抽象类
纯虚函数和抽象类
#include <iostream> using namespace std; ⾯向抽象类编程(⾯向⼀套预先定义好的接⼝编程) class Figure //抽象类 { public: //阅读⼀个统⼀的界⾯(接⼝),让⼦类使⽤,让⼦类必须去实现 virtual void getArea() = 0; //纯虚函数 }; class Circle : public Figure { public: Circle(int a, int b) { this->a = a; this->b = b; } virtual void getArea() { cout<<"圆形的⾯积: "<<3.14*a*a<<endl;; } private: int a; int b; }; class Tri : public Figure { public: Tri(int a,intb) { this->a = a; this->b = b; } virtual void getArea() { cout<<"三⾓形的⾯积: "<<a*b/2<<endl;; } private: int a; int b; }; class Square : public Figure { public: Square(int a,int b) { this->a = a; this->b = b; } virtual void getArea() { cout<<"四边形的⾯积: "<<a*b<<endl; } private: int a; int b; }; void area_func(Figure *base) { base->getArea(); //会发⽣多态 } int main() { //Figure f; //抽象类不能被实例化 Figure *base = NULL; //抽象类不能被实例 Circle c1(10,20); Tri t1(20,30); Square s1(50,60); //⾯向抽象类编程(⾯向⼀套预先定义好的接⼝编程 area_func(&c1); area_func(&t1); area_func(&s1); return 0; }
1,含有纯虚函数的类,称为抽象基类,不可实列化。 即不能创建对象,存在 的意义
就是被继承,提供族类的公共接口。
2,纯虚函数只有声明,没有实现,被“初始化”为 0。
3,如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在
派生类中仍然为纯虚函数,派生类仍然为纯虚基类。
抽象类在多继承中的应用
绝大多数面向对象语言都不支持多继承,绝大多数面向对象语言都支持接口的概念
C++中没有接口的概念,C++中可以使用纯虚函数实现接口
接口类中只有函数原型定义,没有任何数据的定义
class Interface { public: virtual void func1() = 0; virtual void func2(int i) = 0; virtual void func3(int i) = 0; };
#include <iostream> using namespace std; /* C++中没有接⼝的概念 C++中可以使⽤纯虚函数实现接⼝ 接⼝类中只有函数原型定义,没有任何数据的定义。 */ class Interface1 { public: virtual void print() = 0; virtual int add(int a,int b) = 0; }; class Interface2 { public: virtual void print() = 0; virtual int add(int a,int b) = 0; virtual int sub(int a,int b) = 0; }; class parent { public: int a; }; class Child : public parent, public Interface1,public Interface2 { public: void print() { cout<<"Child::print"<<endl; } int add(int a,int b) { return a + b; } int sub(int a,int b) { return a - b; } }; int main() { Child c; c.print(); cout<<c.add(3,5)<<endl; cout<<c.sub(4,6)<<endl; Interface1* i1 = &c; Interface2* i2 = &c; cout<<i1->add(7,8)<<endl; cout<<i2->add(7,8)<<endl; return 0; }