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

一.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;
}


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

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

A.面向对象的抽象概念
在进行面向对象分析时,会发现一些抽象的概念
Q:图形的面积如何计算?

我们知道,在现实中需要知道具体的图形类型才能求面积,所以对概念上的“图形”求面积是没有意义的
B.面对对象的抽象类
1.可用于现实世界中的抽象概念
2.是一种只能定义类型,而不能产生对象的类
3.只能被继承并重写相关函数
4.直接特征是相关函数没有完整的实现
因此,在程序中必须能够反映抽象的图形,程序中通过抽象类表示图形的概念,抽象类不能创建对象,只能用于继承,而在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;
}

运行结果

从示例代码以及运行结果可以看出,纯虚函数实现了我们所需的效果,同时可以总结出:抽象类只能用作父类被继承,子类必须实现纯虚函数的具体功能,纯虚函数被实现后称为虚函数,如果没有子类没有实现纯虚函数,则子类称为抽象类
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.接口是一种 特殊的抽象类

原文地址:https://blog.51cto.com/13475106/2419693

时间: 2024-08-28 17:38:39

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

Java语言中的----抽象类、接口

day12  Java语言中的抽象类与接口 一.抽象类和接口概述; 在昨天我们学习了Java的继承功能,这个是一个核心知识点,今天我们再继承的基础之上学习一下抽象类和接口这两个知识.什么是抽象类?如何定义一个抽象类?如何使用一个抽象类?这些都是我们需要掌握的. 同时我们还要知道如何来定义一个接口,在开发中定义接口来实现相关的功能是一个很重要的功能.如何来实现接口中的抽象方法,这些在这一节都会说到. 二.抽象类和接口 1.抽象类: 什么是抽象类?包含抽象方法的类就叫做抽象类 .使用abstract

C++ 中的抽象类和接口(四十四)

我们在 C++ 的学习中,在进行面向对象分析时,会发现一些抽象的概念.那么在面向对象的语言中,它们是怎么进行描述的呢?比如图形的面积该如何计算?图形可以分为矩形.圆形等.动物都有什么属性?比如老虎.狮子等.那么在现实中需要知道具体的图形类型才能求面积,所以对概念上的"图形"求面积是没有意义的!如 class Shape { public:     double area()     {         return 0;     } }; 此时的 Shape 只是一个概念上的类型,没有

JAVA中的抽象类和接口

一 抽象类 抽象类就是不能被实例化的类,即不可以用new运算符创建本类的对象.在实际应用中,抽象类应该具有子类,且其子类一般不为抽象类. java中使用抽象类的原因有如下四点: 1.抽象类是较高层次的概括,其他的类可以继承它的抽象化特征: 2.抽象类包括它的所有子类共享的公共行为和公共属性,即抽象类中定义一些属性和方法,其他类继承该抽象类并实现这些属性和方法: 3.抽象类使编写程序更贴近人类的思维方式和客观世界: 4.在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性. 二 接口 在接口

PHP中的抽象类和接口

PHP抽象类和抽象方法的应用 抽象类 接口 多态 抽象类是以特殊的类,接口是一种特殊的抽象类声明抽象类和接口,以及一些需要的技术抽象类:    什么是抽象方法?        定义:如果一个类中的方法,没有方法体的方法就是抽象方法(就是一个方法没有使用{}而直接使用分号结束)            function test();  //抽象方法            function test(){    //有方法体,但方法体为空                }            如果

第52课 C++中的抽象类和接口

1. 什么是抽象类 (1)面向对象中的抽象概念 思考:抽象图形中,图形的面积如何计算? (2)现实中:需要知道具体的图形类型,才能求面积. (3)Shape只是一个概念上的类型,没有具体对象 2. 面向对象中的抽象类 (1)可用于表示现实世界中的抽象概念 (2)是一种只能定义类型,而不能产生对象的类 (3)只能被继承并重写相关函数 (4)直接特征是相关函数没有完整的实现 3. 抽象类与纯虚函数 (1)C++语言中没有抽象类的概念,它是通过纯虚函数实现抽象类,当一个C++类中存在纯虚函数就成了抽象

第五十二课、c++中的抽象类和接口

一.c++中的抽象类与纯虚函数 1.面向对象中抽象的概念 (1).现实中需要知道具体图形的类型才能求面积 (2).图形类只是概念上的类型,没有具体对象 2.面向对象中的抽象类 (1).可用于表示现实世界中的抽象概念 (2).是一种只能定义类型,而不能产生对象的类 (3).只能被继承并重写相关的函数 (4).直接特征是相关函数没有完整实现 3.c++中没有抽象类的概念 (1).c++通过纯虚函数实现抽象类 (2).纯虚函数是只定义原型的成员函数 (3).一个c++类中存在纯虚函数就成了抽象类 4.

关于JAVA中的抽象类和接口中常量和变量定义的原因

转载自https://my.oschina.net/cdzsc/blog/86107 在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 1. 为什么接口中只能定义static final:     1.1 static(这时暂且认为是变量)解释:因为一个类可以实现多个接口,如果一个类同时实现了多个接口而每个接口中都定义了同一个变量的话就会产生在类中不知道是哪个接口中的变量了,所以必须定义成stat

.net中的抽象类与接口

学习设计模式的时候很多用到抽象类和接口,用来用去感觉他们两个有点相似,也有点迷糊,到底接口和抽象类有什么区别哪?今天我试着给他俩解开神秘的面纱! 一.抽象类:抽象类说白了就是对类的抽象,它通常代表一个抽象的概念,并提供一个集成的出发点,当设计新的抽象类时,一定是用来继承的,所以,在一个继承关系形成的等级结构里面,树叶节点应当是具体类,树枝节点应该是抽象类. 抽象类的特点 (1)抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法.     (2) 抽象类不能被实例化.     (3) 抽

java中的抽象类和接口详解

1.抽象类 /** 1. 抽象方法一定存在于抽象类中,抽象方法和抽象类需要abstract修饰! 2. 抽象类不能实例化. 3. 如果抽象类中多个抽象方法,而其子类只继承了一个抽象方法,则该子类为抽象类,故也无法实力化. 4. 抽象类只能被子类覆盖其全部的抽象方法,才能建立子类对象! 5. 抽象类中可以有非抽象方法 */ //该子类未覆盖父类func1的抽象方法,故子类为抽象类,不能实例化.编译失败 abstract class Person{     abstract void func();