目录
基本概念
纯虚函数有个非常明确的特点:只定义,却没有函数体,它后面补一个0,目的是让别的类去继承。
含义纯虚函数的类,叫抽象类。虚函数类(抽象类)是不能建立对象的,只有从其继承类,才可以建立对象。
纯虚函数存在的意义是用一个统一的界面或接口来操作所有的类。
抽象类的本质是面向接口编程,跟之前所说的面向对象,面向过程都是不一样的。本质是面向一套预先定义好的接口编程。
这就是解耦合(模块划分的)一把利器。项目经理就定义一套接口,然后,扔给项目成员,把功能给实现了。
举例说明
先定义一个抽象类,且抽象类是不能被实例化,可以用来做继承:
class Figure //抽象类
{
public:
//阅读一个统一的界面(接口),让子类使用,让子类必须去实现
virtual void getArea() = 0 ; //纯虚函数
protected:
private:
};
再创建继承自抽象类的子类:
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, int b)
{
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 objplay(Figure *base)
{
base->getArea(); //会发生多态
}
主函进行调用:
void main511()
{
//Figure f; //抽象类不能被实例化
Figure *base = NULL; //抽象类不能被实例化
Circle c1(10, 20);
Tri t1(20, 30);
Square s1(50, 60);
//面向抽象类编程(面向一套预先定义好的接口编程)
objplay(&c1);
objplay(&t1);
objplay(&s1);
//c1.getArea();
cout<<"hello..."<<endl;
system("pause");
return ;
}
总体代码
dm05_纯虚函数抽象类语法基础.cpp
#include <iostream>
using namespace std;
面向抽象类编程(面向一套预先定义好的接口编程)
//解耦合 ....模块的划分
class Figure //抽象类
{
public:
//阅读一个统一的界面(接口),让子类使用,让子类必须去实现
virtual void getArea() = 0 ; //纯虚函数
protected:
private:
};
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, int b)
{
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 objplay(Figure *base)
{
base->getArea(); //会发生多态
}
void main511()
{
//Figure f; //抽象类不能被实例化
Figure *base = NULL; //抽象类不能被实例化
Circle c1(10, 20);
Tri t1(20, 30);
Square s1(50, 60);
//面向抽象类编程(面向一套预先定义好的接口编程)
objplay(&c1);
objplay(&t1);
objplay(&s1);
//c1.getArea();
cout<<"hello..."<<endl;
system("pause");
return ;
}