温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++--C++对象模型分析、c++中的抽象类和接口

发布时间:2020-06-29 03:14:02 来源:网络 阅读:514 作者:淡淡_小孩 栏目:编程语言

一.C++对象模型分析

A.class是一种特殊的struct
1.在内存中class依旧可以看作变量的合集
2.在class域struct遵循相同的内存对齐规则
3.class中的成员函数与成员变量是分开存放的--每个对象有独立的成员变量,所有对象共享类中的成员函数
Q:class与struct的内存占用情况?

#include <iostream>
#include <string>

using namespace std;

class A
{
    int i;
    int j;
    char c;
    double d;
public:
    void print()
    {
        cout << "i = " << i << ", "
             << "j = " << j << ", "
             << "c = " << c << ", "
             << "d = " << d << endl;
    }
};

struct B
{
    int i;
    int j;
    char c;
    double d;
};

int main()
{
    A a;

    cout << "sizeof(A) = " << sizeof(A) << endl;    
    cout << "sizeof(a) = " << sizeof(a) << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;    

    return 0;
}

C++--C++对象模型分析、c++中的抽象类和接口
运行时的对象退化为结构体的形式
1.所有成员变量在内存中依次排布
2.成员变量间可能存在内存间隙
3.可以通过内存地址直接访问成员变量
4.访问权限关键字运行时失效
5.类的成员函数位于代码段中
6.调用成员函数时对象地址作为参数隐式传递
7.成员函数通过对象地址访问成员变量
8.C++语法规则隐藏了对象地址的传递过程

二,C++中的抽象类和接口

A.面向对象的抽象概念
在进行面向对象分析时,会发现一些抽象的概念
Q:图形的面积如何计算?
C++--C++对象模型分析、c++中的抽象类和接口
我们知道,在现实中需要知道具体的图形类型才能求面积,所以对概念上的“图形”求面积是没有意义的
B.面对对象的抽象类
1.可用于现实世界中的抽象概念
2.是一种只能定义类型,而不能产生对象的类
3.只能被继承并重写相关函数
4.直接特征是相关函数没有完整的实现
因此,在程序中必须能够反映抽象的图形,程序中通过抽象类表示图形的概念,抽象类不能创建对象,只能用于继承,而在C++语言中没有抽象类的概念,C++中通过纯虚函数实现抽象类,纯虚函数是指只定义原型的成员函数,一个C++类中存在纯虚函数就成为了抽象类。
纯虚函数的语法规则
C++--C++对象模型分析、c++中的抽象类和接口
代码示例

#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)
{
    double r = p->area();

    cout << "r = " << r << endl;
}

int main()
{
    Rect rect(1, 2);
    Circle circle(10);

    area(&rect);
    area(&circle);

    return 0;
}

运行结果
C++--C++对象模型分析、c++中的抽象类和接口
从示例代码以及运行结果可以看出,纯虚函数实现了我们所需的效果,同时可以总结出:抽象类只能用作父类被继承,子类必须实现纯虚函数的具体功能,纯虚函数被实现后称为虚函数,如果没有子类没有实现纯虚函数,则子类称为抽象类
B.接口的概念
1.类中没有定义任何的成员变量
2.所有的成员函数都是公有的
3.所有的成员函数都是纯虚函数
4.接口是一种特殊的抽象类
代码示例

#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.抽象类由于描述现实世界中的抽象概念
2.抽象类只能被继承不能创建对象
3.C++中没有抽象类的概念
4.C++中通过纯虚函数实现抽象类
5.类中只存在纯虚函数的时成为接口
6.接口是一种 特殊的抽象类

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI