52-C++中的抽象类和接口

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:9.2.0

 

一、什么是抽象类?

1)面向对象中的抽象概念

            在进行面向对象分析时,会发现一些抽象的概念

                            图形的面积如何计算?

        在现实中需要知道具体的图形类型才能求面积,

        所有对概念上的“图形”求面积是没有意义的!(因为不知道图形类型)

class Shape
{
public:
    double area()
    {
        return 0;
     }
};

             Shape只是一个概念上的类型,没有具体对象!

二、问题

            Shape类有必要存在吗?

 

三、什么是抽象类?

1)面向对象中的抽象类

    -    可用于表示现实世界中的抽象概念

    -    是一种只能定义类型,而不能产生对象的类

    -    只能被继承并重写相关函数

    -    直接特征是相关函数没有完整的实现

设计小技巧:父类肯定要被继承,如果父类没有必要产生对象,就可以把父类做成抽象类。

 

四、面向对象中的抽象类

1)Shape是现实世界中各种图形的抽象概念

2)因此:

        -    程序中必须能够反映抽象的图形

        -    程序中通过抽象类表示图形的概念

        -    抽象类不能创建对象只能用于继承

 

五、抽象类与纯虚函数

1)C++语言中没有抽象类的概念

2)C++中通过纯虚函数实现抽象类 (纯虚函数也是虚函数

3)纯虚函数是指只定义原型的成员函数(没有功能实现都可以,只有函数声明)

4)一个C++类中存在纯虚函数就成了抽象类(抽象类的定义)

5)纯虚函数的语法规则

class Shape    //抽象类
{
public:
    virtual double area() = 0;    //纯虚函数
};

        "=0"用于告诉编译器当前是声明

        纯虚函数,因此不需要定义函数体

如果用Shape生成一个对象,编译器就会直接报错!

编程实验
抽象类初探
52-1.cpp
#include <iostream>
#include <string>

using namespace std;

class Shape
{
public:
    virtual double area() = 0;
};

class Rect : public Shape
{
    int ma;
    int mb;
public:
    Rect(int a, int b)
    {
        ma = a;
        mb = b;
    }
    double area()
    {
        return ma * mb;
    }
};

class Circle : public Shape
{
    int mr;
public:
    Circle(int r)
    {
        mr = r;
    }
    double area()
    {
        return 3.14 * mr * mr;
    }
};

void area(Shape* p)   //定义指针p,不是对象。可以用抽象类定义指针,指向了子类。
{
    double r = p->area();    //r ==> result。
    
    cout << "r = " << r << endl;
}

int main()
{
    Rect rect(1, 2);
    Circle circle(10);
    
    area(&rect);
    area(&circle);
    
    return 0;
}

操作:

1) g++ 52-1.cpp -o 52-1.out编译错误,打印结果:

r = 2
r = 314

分析:3部曲

1.定义抽象类Shape

2.定义Rect和Circle类,都继承自Shape

3.利用多态知识,定义全局函数area,用同一个函数计算不同图形面积(形参Shape*)

 

6)抽象类只能用作父类被继承

7)子类必须实现纯虚函数的具体功能

8)纯虚函数被实现后成为虚函数

9)如果子类没有实现纯虚函数,则子类成为抽象类

 

10)满足下面条件的C++类则称为接口 (数据结构中大量使用)

        -    类中没有定义任何的成员变量

        -    所有的成员函数都是共有的(public)

        -    所有的成员函数都是纯虚函数

        -    接口是一种特殊的抽象类

C#和Java有接口的概念。

 

编程实验
接口初探
52-2.cpp
#include <iostream>
#include <string>

using namespace std;

class Channel
{
public:
    virtual bool open() = 0;
    virtual void close() = 0;
    virtual bool send(char* buf, int len) = 0;
    virtual int receive(char* buf, int len) = 0;
};

int main()
{
    return 0;
}

 

操作:

1) g++ 52-2.cpp -o 52-2.out编译正确。

 

小结

1)抽象类用于描述现实世界中的抽象概念(抽象成一类事物,调用这类事物子功能进行操作)

2)抽象类只能被继承不能被创建对象

3)C++中没有抽象类的概念

4)C++中通过纯虚函数实现抽象类

5)类中只存在纯虚函数的时成为接口

6)接口是一种特殊的抽象类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值