zoukankan      html  css  js  c++  java
  • 纯虚函数和抽象类

    1.纯虚函数是一个在基类中声明的虚函数,在基类中没有定义,它要个各个派生类都定义自己的版本;

    2.纯虚函数为各个派生类提供一个公共界面(接口的封装和设计,软件的模块功能划分);

    3.纯虚函数的形式: virtual 类型 函数名(参数列表) = 0;

    4.一个具有纯虚函数的基类称为抽象类。

    抽象类shape的用法说明:

    1.shape x;   //error,抽象类不能定义对象

    2.shape *p   //ok,可以声明抽象类的指针

    3.shape fun()  //error,抽象类不能作为函数返回类型

    4.void fun(shape)  //error,抽象类不能作为函数参数类型

    5.shape& fun(shape&)  //ok,可以声明抽象类的引用

    纯虚函数的例子:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 //抽象类,封装好函数的接口,为下面的派生类搭好框架,则用抽象类的指针(或引用)可以访问派生类的属性
     5 class Point
     6 {
     7 public:
     8     virtual float getArea()=0;
     9 private:
    10 };
    11 
    12 //派生类
    13 class Rectangle:public Point
    14 {
    15 public:
    16     Rectangle(float len,float wid):length(len),width(wid){}
    17     virtual float getArea(){return length*width;}
    18 private:
    19     float length;
    20     float width;
    21 };
    22 
    23 //派生类
    24 class Circle:public Point
    25 {
    26 public:
    27     Circle(float r):radiu(r){}
    28     virtual float getArea(){return 3.1416*radiu*radiu;}
    29 private:
    30     float radiu;
    31 };
    32 
    33 
    34 void fun(Point* p)
    35 {
    36     cout<<p->getArea()<<endl;
    37 }
    38 
    39 
    40 int main()
    41 {
    42     Rectangle rec(4,5);
    43     Circle    cir(6);
    44 
    45     fun(&rec);
    46     fun(&cir);
    47 
    48     return 0;
    49 }

    抽象类在多继承中的应用:

    一个子类继承了多个父类,父类之间的普通函数如果重名(函数名和函数参数相同),则子类调用该普通函数时会发生二义性,C++编译器不知道子类调用的是继承自哪个父类的普通函数。

    如果父类之间重名的函数是纯虚函数,则子类调用该函数时一定不会出现二义性的问题。因为父类中的纯虚函数相当于是定义封装了函数接口,在子类中必然会重写纯虚函数,对该纯虚函数做具体的实现,函数调用时调用的一定是子类的函数。

  • 相关阅读:
    9、二叉排序树的创建、插入、遍历
    8、判断两个链表是否相交
    7、判断链表是否有环
    6、查找单链表中倒数第n个节点
    5、单链表的反转
    4、KMP(看毛片)算法
    3、希尔排序
    2、快速排序
    json字符串转为json对象
    json对象转化为字符串过程分析
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8398152.html
Copyright © 2011-2022 走看看