美文网首页
C++中的抽象类和接口

C++中的抽象类和接口

作者: 突击手平头哥 | 来源:发表于2019-10-21 16:33 被阅读0次

C++中的抽象类和接口

抽象类

抽象类用来描述一种类型应该具备的基本特征与功能, 具体如何去完成这些行为由子类通过方法重写来完成;比如动物都会跑, 但是跑这个功能具体的实现是由人/狗等等子类来实现的, 动物这个类的跑实际的实现与细节我们是无法写出来和实现的.

  在C++中要实现所谓的抽象类就是需要实现通过纯虚函数实现, 如果该类存在纯虚函数的成员就是抽象类; 纯虚函数指的是只有原型的定义而没有实现的函数. 抽象类无法生成实例, 只能被继承的子类也没有实现那么也是一个抽象类.

抽象类简单代码说明

class A
{
    virtual void test() = 0;
    ...
}

virtual指明这是一个虚函数, =0指明这是一个纯虚函数不需要实现;

ps: 虚函数(如果不加=0), 父类实现并可以直接使用, 同时也可以被重载后在子类中使用.

接口

  所有成员函数均为纯虚函数的类并且没有定义任何成员变量的类即为接口

多态

  C++中可以让一个父类指针实际指向与一个子类, 而C++中的多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

class A
{
    virtual void out() = 0;
}
class B : public A
{
    void out(){printf("%s\n", "B");}
}
class C : public A
{
    void out(){printf("%s\n", "C");}
}

...

A *ab = new B;
A *ac = new C;

假设我们给一个函数传入类A, 但是实际可能是类B或者类C, 在调用成员函数out时会自动调用各自不同的实现; 这就是多态

虚表

   那么多态是怎么实现的呢? 如果不考虑很复杂的实现, 那么我们很简单的就可以猜到必然是使用一个指针来获取这些信息, 这就是虚表的指针; 我们可以测试一下, 一个继承了虚函数的类会比没有的多出4(或者)8个字节, 就是一个指针的大小

虚表的含义: 虚表在编译阶段构造出来的表, 每个有虚函数的类或者继承具有虚函数的基类, 编译器都会为它生成一个虚拟函数表, 虚表中的每一个元素都分别指向一个虚函数的地址; 该类所有对象都有一个虚表指针指向同一个表

ps: 笔者在网上看了一下, 发现类的内存结构中似乎第一个就是虚表的指针, 也就意味着把类指针强转为虚表的指针从而实现直接获取虚表中的函数地址。

相关文章

  • C++中的抽象类和接口

    C++中的抽象类和接口 抽象类 抽象类用来描述一种类型应该具备的基本特征与功能, 具体如何去完成这些行为由子类通过...

  • 《JAVA编程思想》学习笔记:第9章(接口)

    第9章 接口 目录 9.1 C++的抽象设计 : 在C++中,只有抽象类的概念(没有abstract关键字),没有...

  • C++----接口(抽象类)

    接口描述了类的行为和功能,而不需要完成类的特定实现。 C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,...

  • 1.2.25_C++ 接口(抽象类)

    接口描述了类的行为和功能,而不需要完成类的特定实现。 C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,...

  • C++中的抽象类和接口

    抽象类 面向对象中的抽象类可用于表示现实世界中的抽象概念是一种智能定义类型,而不能产生对象的类只能被继承并重写相关...

  • C++核心知识点

    相对于c,cpp的特点在于类,接口和模版 接口 cpp-interfaces C++ 接口是使用抽象类来实现的,抽...

  • C++ 接口(抽象类)使用

    接口描述了类的行为和功能,而不需要完成类的特定实现。C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数...

  • Java抽象类和接口类

    Java中接口和抽象类的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?能解决哪些编程...

  • 第18条:接口优于抽象类

    java中可以用来定义允许多个实现的类型有两种:接口和抽象类。 接口和抽象类的区别: 1,抽象类中可以存在某些方法...

  • 接口测试哪几个点是需要特别关注的?

    接口和抽象类的区别: 1、都不能被实例化。 2、接口的实现类和抽象类的子类只有全部实现了接口或者抽象类中的方法后才...

网友评论

      本文标题:C++中的抽象类和接口

      本文链接:https://www.haomeiwen.com/subject/rubtvctx.html