c++入门(多态and纯虚函数and抽象类)

文件名:<1> shape.h ;<2> circle.h ;<3> circle.cpp ;<4> rectangular.h ;<5> rectangular.cpp ;<6> main.cpp

1、多态

是面向对象程序设计的关键技术。

调用同一个函数名,可以根据需要实现不同的功能。

编译时的多态性(函数重载);运行时的多态性(虚函数)。

2、纯虚函数

在函数基类中声明,在派生类中实现。

virtual关键字;声明时须在后面加上 =0;派生类中实现时无须写virtual。

3、抽象类

含有纯虚函数的类。

在派生类实现该纯虚函数后,定义抽象类对象的指针,并指向引用的子类对象


注:

可以把析构函数定义为虚函数,但不能将构造函数定义为虚函数。

因为定义为虚函数的构造函数只是声明了而没有实现,没有初始化,不能被继承。

每个类都要有自己的构造函数,对自己进行初始化。


<1> shape.h


  1 //文件名 shape.h
  2 
  3 #ifndef SHAPE_H //防止重复包含的宏开关
  4 #define SHAPE_H
  5 
  6 #include 
  7 
  8 /* virtual在基类中声明纯虚函数,其实现在派生类中  */
  9 class i_Shape
 10 {
 11 public:
 12         virtual float getArea() = 0;    //纯虚函数的声明:virtual关键字,声明之后写上 =0
 13         virtual std::string getName() = 0;
 14 
 15 };
 16 
 17 #endif

<2> circle.h


  1 //文件名 circle.h
  2 
  3 #ifndef CIRCLE_H
  4 #define CIRCLE_H
  5 
  6 #include "shape.h"
  7 
  8 class c_Circle : public i_Shape //继承i_Shape
  9 {
 10 public:
 11         c_Circle(float radius); //含参数的构造函数
 12 public:
 13         virtual float getArea();        //抽象类的虚函数。此处需要关键字virtual,但不需要在后面加上 =0
 14         virtual std::string getName();
 15 private:
 16         float m_Radius;
 17 };
 18 
 19 #endif

<3> circlr.cpp


  1 //文件名 circle.cpp
  2 
  3 #include "circle.h"
  4 
  5 c_Circle::c_Circle(float radius)        //含参数的虚构函数
  6         :m_Radius(radius)       //初始化列表
  7 {
  8 
  9 }
 10 
 11 float c_Circle::getArea()       //虚函数的实现。此处无须关键字virtual
 12 {
 13         return 3.14 * m_Radius * m_Radius;
 14 }
 15 
 16 std::string c_Circle::getName()         //虚函数的实现。此处无须关键字virtual
 17 {
 18         return "circle 圆形的";
 19 }

<4> rectangular.h


  1 //文件名 rectangualr.h
  2 
  3 #ifndef RECTANGULAR_H   //防止重复包含的宏开关
  4 #define RECTANGULAR_H
  5 
  6 #include "shape.h"
  7 
  8 class c_Rect : public i_Shape   //继承 i_Shape接口 interface
  9 {
 10 public:
 11         c_Rect();       //不含参数的默认构造函数
 12         ~c_Rect();      //析构函数
 13         c_Rect(float width,float length);       //含参数的构造函数
 14 public:
 15         virtual float getArea();        //virtual虚函数。。此处无须写 =0
 16         virtual std::string getName();
 17 private:
 18         float m_Width;  //private成员
 19         float m_Length;
 20 
 21 };
 22 
 23 #endif


<5> rectangular.cpp


  1 //文件名 rectangular.cpp
  2 
  3 #include "rectangular.h"
  4 
  5 c_Rect::c_Rect()        //不含参数的默认构造函数
  6 {
  7 
  8 }
  9 
 10 c_Rect::~c_Rect()       //析构函数
 11 {
 12 
 13 }
 14 
 15 c_Rect::c_Rect(float width,float length)        //含参数的构造函数
 16         :m_Width(width),m_Length(length)        //初始化列表:以冒号开头,以逗号分隔
 17 {
 18 
 19 }
 20 
 21 float c_Rect::getArea() //虚函数的实现
 22 {
 23         return m_Width * m_Length;
 24 }
 25 
 26 std::string c_Rect::getName()   //虚函数的实现
 27 {
 28         return "Rectangular 方形的";
 29 }

<6> main.cpp


  1 //文件名 main.cpp
  2 //
  3 #include "rectangular.h"
  4 #include "circle.h"
  5 
  6 #include 
  7 
  8 int main()
  9 {
 10         /* 定义抽象类对象i_Shape的指针p,并指向引用的子类对象c_Circle  */
 11         i_Shape* p = new c_Circle(10);
 12         std::cout<< p -> getName() << "  " << p -> getArea() < getName() << "  " << p -> getArea() <

编译、链接、执行


c++入门(多态and纯虚函数and抽象类)_第1张图片

你可能感兴趣的:(c++,c++,类和对象,虚函数,抽象类)