首页 > 其他分享 >抽象类

抽象类

时间:2023-02-26 19:45:55浏览次数:31  
标签:0000 函数 mov 纯虚 虚表 抽象类

1. 纯虚函数

1)概念

​ 在虚函数的声明结尾处添加“=0”,这种虚函数被称为纯虚函数,是一个没有实现只有声明的函数

2)作用

​ 为了让类具有抽象类的功能,让继承自抽象类的子类都具有虚表以及虚表指针

image-20230226192954776

3)纯虚函数在虚表中的处理

​ 因为纯虚函数没有实现代码,所以没有首地址。编译器为了防止误调用纯虚函数,将虚表中保存的纯虚函数的首地址项替换成函数__purecall,用于结束程序

2. 抽象类

不能实例化(且不可作为参数、返回值、类型转换)(声明抽象类指针或引用,指向子类来体现多态)

1)概念

​ 含有纯虚函数的类

2)抽象类的特征

​ 一旦在虚表中发现函数地址为__purecall(GCC编译器函数名称为___cxa_pure_virtual)函数的地址时,可以高度怀疑此虚表对应的类是一个抽象类

​ 当抽象类中定义了多个纯虚函数时,虚表中将保存相同的函数指针

image-20230226193255783

c++代码示例:

#include <stdio.h> 
class AbstractBase  {
  public:
  AbstractBase()  {
    printf("AbstractBase()"); 
  }
  virtual void show() = 0; //定义纯虚函数 
};

class VirtualChild : public AbstractBase  {     //定义继承抽象类的子类
public:
  virtual void show() {                         //实现纯虚函数
    printf("抽象类分析\n"); 
  }
};
int main(int argc, char* argv[]) { 
  VirtualChild obj;
  obj.show(); 
  return 0; 
}

vs_x86汇编标识:

00401020  push    ebp                           ;抽象类构造函数
00401021  mov     ebp, esp
00401023  push    ecx
00401024  mov     [ebp-4], ecx
00401027  mov     eax, [ebp-4]

0040102A  mov     dword ptr [eax], offset ??_7AbstractBase@@6B@ ;设置抽象类虚表指针
00401030  push    offset aAbstractbase ; "AbstractBase()"
00401035  call    sub_4010D0           ;调用printf函数
0040103A  add     esp, 4
0040103D  mov     eax, [ebp-4]
00401040  mov     esp, ebp
00401042  pop     ebp
00401043  retn

;抽象类AbstractBase中虚表信息的第一项所指向的函数首地址 
0000:00401C3B  push    esi                      ;__purecall函数
0000:00401C3C  mov     esi, dword_419C6C
0000:00401C42  test    esi, esi
0000:00401C44  jz      short loc_401C50
0000:00401C46  mov     ecx, esi
0000:00401C48  call    ds:___guard_check_icall_fptr
0000:00401C4E  call    esi ; dword_419C6C
0000:00401C50  call    _abort                   ;结束程序

标签:0000,函数,mov,纯虚,虚表,抽象类
From: https://www.cnblogs.com/XiuzhuKirakira/p/17157425.html

相关文章

  • 多态、抽象类、接口练习:愤怒的小鸟
    需求说明:模拟实现愤怒的小鸟,定义鸟叫的接口,定义"嗷嗷叫",“喳喳叫"两种实现类定义抽象类,“鸟”,将接口定义为鸟的属性,并定义两个子类,“炸弹鸟”,“分裂鸟”定义......
  • 抽象类和接口
    抽象类代表一个抽象概念的类;规定整个类家族都必须具备的属性和行为。一、抽象类性质类名前加修饰符abstract;可包含常规类能包含的任何成员,包括非抽象方法;也可包含......
  • 抽象类
    Q:为什么引入抽象类?A:父类方法的不确定性classAnimal{privateStringname;privateintage;publicAnimal(Stringname,intage){this.name......
  • 纯虚函数和抽象类
    纯虚函数和抽象类纯虚函数是一种特殊的虚函数,在某些情况下,基类中不能对虚函数给出有意义的实现,把它声明为纯虚函数。纯虚函数只有函数名、参数和返回值类型,没有函数体,具......
  • 抽象类和接口
    抽象类概念抽象方法:只有方法的定义,没有方法体的实现,这种方法就是抽象方法定义类抽象方法的类,就是抽象类 定义和实现抽象类和抽象方法是用abstract关......
  • JAVA 抽象类
    抽象类 在java语言继承层次结构中,位于上层的类更具有通用性,甚至更加抽象,这些类封装的方法被重写的可能更大.java用关键字  abstract 格式为: [访问控制符]a......
  • Java抽象类与接口
    Java中抽象类与接口Java抽象类在java中定义抽象类使用abstract关键字,具体用法如下:abstractclassAbstractClassName{}需要注意的是,定义一个抽象类的类名应该......
  • 抽象类和抽象方法
    java中的抽象类与抽象方法​​1、设计理念​​​​2、抽象方法​​​​3、抽象类​​​​3.1抽象类与普通类的区别​​​​3.2抽象类案例​​1、设计理念  父类要体现所......
  • abstract 抽象类
     约束~抽象方法,只有方法名字,没有方法的实现不能new这个抽象类,只能靠子类去实现它;约束!抽象类中可以写普通方法~抽象方法必须在抽象类中~......
  • Java 抽象类
    目录1、抽象方法和抽象类2、抽象类的作用当编写一个类时,常常会为该类定义一些方法,用于描述该类的行为方式,这些方法都有具体的方法体。但在某些情况下,某个基类只是知道其子......