对象、super、isa、class 和 SuperClass 的理解

第 18 章:ART 运行时 Android运行时(ART)是Android应用的执行环境,负责加载和执行DEX字节码。ART通过多层级编译策略(解释器、JIT、AOT)和并发垃圾回收(如CC和CMC收集器)优化性能。关键组件包括类链接器、dex2oat编译器、JIT编译器和内存管理系统。ART支持模块化更新,并通过配置文件引导优化(PGO)提升应用性能。调试能力基于JVMTI,提供断点、类重定义等功能。Android 17引入了多项改进,如分代标记-压缩GC、禁止反射修改static final字段、DEX容器格式V41等。ART架构 阅读详情

super

super:是编译器指示符,仅仅是一个标志,并不是指针,仅仅是标志的当前对象去调用父类的方法,本质还是当前对象调用。

 super的本质:其实还是当前对象去调用,只不过让当前对象去调用父类方法, super不是父类对象,指的是父类方法。

superclass

superclass:获取方法调用者的父类

class

class:获取方法调用者的类对象 

 

Q:OC中对象分类

A:总共为三类:实例对象、类对象、元类对象

  • instance对象(实例对象)
  • class对象(类对象)
  • meta-class对象(元类对象)

实例对象(instance)

  • instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
Student *p1 = [[Student alloc] init];
Student *p2 = [[Student alloc] init];
  • p1、p2是Student的instance对象(实例对象),它们是不同的两个对象,分别占据着两块不同的内存

     

    p1、p2内存地址

instance对象在内存中存储的信息包括

  • isa指针
  • 其他成员变量的值
  • 实例对象不包含实现方法

类对象(Class)

NSObject *obj1 = [[NSObject alloc] init];
Class objClass1 = [obj1 class];
Class objClass2 = [NSObject class];
//class 方法返回的一直是class对象,类对象,而不是元类对象
Class objClass3 = [[NSObject class] class];
Class objClass4 = object_getClass(obj1);
NSLog(@"%p-%p-%p-%p",objClass1,objClass2,objClass3,objClass4);
  • 上述都是同一个类对象,打印出的地址相同,每个类在内存中有且只有一个class对象

class对象在内存中存储的信息包括

  • isa指针
  • superclass指针
  • 类的属性信息(@property)
  • 类的实例方法信息(instance method)
  • 类的协议信息(protocol)
  • 类的成员变量信息(ivar)(成员变量类型、名称等等,不是成员变量的值)
  • ......

元类对象(meta-class)

Class metaClass = object_getClass([NSObject class]);
  • 每个类在内存中有且只有一个meta-class对象
  • meta-class对象和class对象的内存结构是一样的,但是用途不一样

在内存中存储的信息主要包括

  • isa指针
  • superclass指针
  • 类的类方法信息(class method)
  • ......

方法说明

1.Class objc_getClass(const char *aClassName)

  • 1> 传入字符串类名
  • 2> 返回对应的类对象

2.Class object_getClass(id obj)

  • 1> 传入的obj可能是instance对象、class对象、meta-class对象
  • 2> 返回值
    a) 如果是instance对象,返回class对象
    b) 如果是class对象,返回meta-class对象
    c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象

Q:实例对象、类对象isa指向

A:instance的isa指向class,class的isa指向meta-class

  • 当调用实例方法时,通过instance的isa找到class,最后找到实例方法的实现进行调用
  • 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用

     

    isa指向

Q:对象的isa指针指向哪里?

A:根据不同类型的对象来回答。

  • instance对象的isa指向class对象
  • class对象的isa指向meta-class对象
  • meta-class对象的isa指向基类的meta-class对象

Q:OC的类信息存放在哪里?

A:类的内容分别作答。

  • 实例方法、属性、成员变量、协议信息,存放在class对象中
  • 类方法,存放在meta-class对象中
  • 成员变量的具体值,存放在instance对象

Q问题描述:Student类继承自Person;Person继承自NSObject

示例代码:

@interface Person : NSObject<NSCopying>
{
    int _age;
    int _name;
    int _bro;
}
- (void)personInstanceMethod;
+ (void)personClassMethod;
@end

@implementation Person
- (void)personInstanceMethod{
    
}
+ (void)personClassMethod{
    
}
- (id)copyWithZone:(NSZone *)zone{
    return nil;
}
@end

@interface Student : Person<NSCopying>
{
    int _dog;
    int _cat;
    int _book;
    
    int _phone;
    int _bicycle;
    
    int _hat;
    int _clothes;
    int _pants;
}
- (void)studentInstanceMethod;
+ (void)studentClassMethod;
@end

@implementation Student
- (void)studentInstanceMethod{}
+ (void)studentClassMethod{}
@end

q1:上述代码各类对象superclass指向?

a1:各类的superclass指向父类对象

类对象的superclass指针指向父类对象

 

各类superclass指向

q2:Student实例对象调用Student实例方法的调用流程?

示例代码:

Student *stu = [[Student alloc] init];
[stu studentInstanceMethod];

a2:stu实例对象isa找到Student的类对象,调用实例方法

实例对象调用实例方法流程

q3:Student实例对象调用Person实例方法的调用流程?

示例代码:

Student *stu = [[Student alloc] init];
[stu personInstanceMethod];

a3:stu实例对象isa找到Student的类对象,通过Student的superclass找到Person的类对象,最后调用Person的实例方法实现。

stu调用Person实例方法流程

q4:Student实例对象调用init方法的调用流程?

示例代码:

Student *stu = [[Student alloc] init];
[stu init];

a3:调用流程

  • 1.stu实例对象isa找到Student的类对象
  • 2.通过Student的superclass找到Person的类对象
  • 3.通过Person的superclass找到NSObject的类对象
  • 4.最后调用NSObject的init方法实现。

Q:Student类继承自Person;Person继承自NSObject,各类元类的superclass指针指向?

A:Student元类superclass指向Person的元类,Person元类superclass指向NSObject的元类

各类元类的superclass指针指向

q1:参考上述示例,[Student studentClassMethod] 调用流程
a1:Student类isa指针找到 Student元类,然后调用类方法 studentClassMethod

q2:参考上述示例,[Student personClassMethod] 调用流程
a3:Student类isa指针找到 Student元类,Student元类的superclass找到Person元类,再调用personClassMethod

q2:参考上述示例,[Student load] 调用流程
a3:Student类isa指针找到 Student元类,Student元类的superclass找到Person元类,Person元类的superclass找到NSObject元类,再调用load

isa、superclass 小结

  • instance的isa指向class
  • class的isa指向meta-class
  • meta-class的isa指向基类的meta-class
  • class的superclass指向父类的class,如果没有父类,superclass指针为nil
  • meta-class的superclass指向父类的meta-class;基类的meta-class的superclass指向基类的class
  • instance调用实例方法的轨迹;isa找到class,方法不存在,就通过superclass找父类
  • class调用类方法的轨迹;isa找meta-class,方法不存在,就通过superclass找父类

isa、superclass指向

上述图片备注:isa指向为虚线、superclass指向为实线,Root class元类的superclass指向Root class的class(转弯处实线)。可以按照Student、Person、NSObject来理解。

  • 如果在基类中找不到方法实现,会报错unrecognized selector sent to class 0x1000011**

Q:如果调用类方法没有实现,是否会调用同名的实例方法。

A:会。

调用方法实质是runtime的消息转发机制,runtime只会根据方法名寻找而不会在意是类方法还是实例方法。
代码验证:

#Person文件
@interface Person : NSObject
+ (void)test;
@end

@implementation Person
+ (void)test{
    NSLog(@"+[Person test] %p",self);
}
@end

#NSObject+Test文件
@interface NSObject (Test)
+ (void)test;
@end

@implementation NSObject (Test)
+ (void)test{
    NSLog(@"+[NSObject test] %p",self);
}
@end

#调用方式:

NSLog(@"Person:%p",[Person class]);
NSLog(@"NSObject:%p",[NSObject class]);
[Person test];
[NSObject test];

输出结果1:

Person:0x10e72e090
NSObject:0x10f6d8ea8
+[Person test] 0x10e72e090
+[NSObject test] 0x10f6d8ea8

输出结果2:(如果将Person的类方法注释掉,其余代码不变)

#Person 文件
@interface Person : NSObject
+ (void)test;
@end

@implementation Person
//+ (void)test{
//    NSLog(@"+[Person test] %p",self);
//}
@end

输出结果2:
Person:0x10477b050
NSObject:0x105725ea8
+[NSObject test] 0x10477b050
+[NSObject test] 0x105725ea8

因为Person里找不到test实现方法,即找父类的实现方法

输出结果3:(如果将Person和NSObject的类方法注释掉,其余代码不变)

#Person 文件
@interface Person : NSObject
+ (void)test;
@end

@implementation Person
//+ (void)test{
//    NSLog(@"+[Person test] %p",self);
//}
@end

#NSObject+Test文件
@interface NSObject (Test)
+ (void)test;
@end

@implementation NSObject (Test)
//+ (void)test{
//    NSLog(@"+[NSObject test] %p",self);
//}
@end

输出结果3:会报错
Person:0x10766efd0
NSObject:0x108618ea8
+[Person test]: unrecognized selector sent to class 0x10766efd0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[Person test]: unrecognized selector sent to class 0x10766efd0'

输出结果4:(如果将Person和NSObject的类方法注释掉,NSObject添加对象同名方法,其余代码不变)

#Person 文件
@interface Person : NSObject
+ (void)test;
@end

@implementation Person
//+ (void)test{
//    NSLog(@"+[Person test] %p",self);
//}
@end

#NSObject+Test文件
@interface NSObject (Test)
+ (void)test;
@end

@implementation NSObject (Test)
- (void)test{
    NSLog(@"-[NSObject test] %p",self);
}

//+ (void)test{
//    NSLog(@"+[NSObject test] %p",self);
//}
@end

输出结果4:
Person:0x101656010
NSObject:0x102600ea8
-[NSObject test] 0x101656010
-[NSObject test] 0x102600ea8

由此可见,当类方法无实现时,会调用同名的实例方法,上述辩证方法验证了isa、superclass指向图中的meta-Root class的superclass指向Root class(上图实线转弯处)。

Q:讨论isa指针值

从64bit开始,isa需要进行一次位运算,才能计算出真实地址
示例代码:

struct xbt_objc_class {
    Class isa ;
};

Person *p = [[Person alloc] init];
Class pClass = [Person class];
Class personMetaClass = object_getClass(pClass);
struct xbt_objc_class *pClass1 = (__bridge struct xbt_objc_class *)pClass;
NSLog(@"%p-%p-%p",p,pClass,personMetaClass);

LLDB 命令行查看isa值

(lldb) p p->isa//获取不到真正的isa指针
(Class) $0 = Person
(lldb) p/x (long)p->isa
(long) $1 = 0x000001a100105311//实例对象isa指针
(lldb) p/x pClass
(Class) $2 = 0x0000000100105310 Person//类对象地址
(lldb) p/x 0x000001a100105311 & 0x0000000ffffffff8//进行换算
(long) $3 = 0x0000000100105310

(lldb) p/x pClass1->isa
(Class) $0 = 0x000001a10402d2e9//类对象isa指针值
(lldb) p/x personMetaClass
(Class) $1 = 0x000000010402d2e8//元类对象isa指针值
(lldb) p/x 0x000001a10402d2e9 & 0x0000000ffffffff8//进行换算
(long) $2 = 0x000000010402d2e8
0x1c0036780-0x102a41310-0x102a412e8

结果可见:
1.实例对象isa值为0x000001a100105311
2.类对象地址为0x0000000100105310
3.换算结果:实例对象isa指针值 &0x0000000ffffffff8才与类对象地址值相同
4.类对象isa指针为0x000001a10402d2e9。(类并没有暴露出isa指针值,定义了一个和类相似的结构体xbt_objc_class,进行强制转换后,才获取到类对象的isa指针)
5.元类对象地址为0x000000010402d2e8
6.换算结果:类对象isa指针值 &0x0000000ffffffff8才与元类对象地址值相同

总结

  • 从64bit开始,isa需要进行一次位运算,才能计算出真实地址
  • isa指针需要 & ISA_MASK 值才是最终结果
  • runtime中ISA_MASK值:
# if __arm64__//iPhone
#   define ISA_MASK        0x0000000ffffffff8ULL
# elif __x86_64__//mac
#   define ISA_MASK        0x00007ffffffffff8ULL

Q:讨论superclass指针值,是否会想isa指针值一样?

A:superclass指针值与指向对象地址相同,和isa指针值不一样

代码证明
前提:student继承自Person,写结构体来代替类

struct xht_objc_class {
    Class isa ;
    Class superclass ;
};
struct xht_objc_class *pClass = (__bridge struct xht_objc_class *)[Person class];
struct xht_objc_class *stuClass = (__bridge struct xht_objc_class *)[Student class];
NSLog(@"%p-%p",pClass,stuClass);

LLDB调试

(lldb) p/x stuClass->superclass
(Class) $0 = 0x0000000102299340 Person//Student类的superClass值
(lldb) p/x pClass
(xht_objc_class *) $1 = 0x0000000102299340//Person类地址

综上所述,Student类的superClass值 = Person类地址

Q:类的本质结构

类的本质是结构体
附上runtime的结构体代码

#objc_class:objc_object
struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    //方法缓存
    cache_t cache;             // formerly cache pointer and vtable
    //用于获取具体类信息
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() { 
        return bits.data();
    }
    // 诸多方法
}

#class_rw_t
struct class_rw_t {
    // Be warned that Symbolication knows the layout of this structure.
    uint32_t flags;
    uint32_t version;

    const class_ro_t *ro;//只读类表

    method_array_t methods;//方法列表
    property_array_t properties;//属性列表
    protocol_array_t protocols;//协议列表
     // 诸多方法
}

#class_ro_t
struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize;//instance对象占用的内存空间
#ifdef __LP64__
    uint32_t reserved;
#endif

    const uint8_t * ivarLayout;
    
    const char * name;//类名
    method_list_t * baseMethodList;
    protocol_list_t * baseProtocols;
    const ivar_list_t * ivars;//成员变量列表

    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties;

    method_list_t *baseMethods() const {
        return baseMethodList;
    }
};

#objc_object
struct objc_object {
private:
    isa_t isa;//类的isa指针是私有的

public:
      // 诸多方法
}

结构体结构

想LLDB命令查看相关类结构,可以采取仿写类结构进行打印查看 

小红书2020校招iOS笔试题解析:底层原理高频考点 iOS开发中,Runtime与内存管理是衡量工程师底层功底的关键。理解消息转发、Block捕获机制、ARC下的引用计数原理,不仅能解决线上崩溃与内存泄漏问题,更是大厂校招面试的高频考点。从Category与关联对象的区别,到GCD死锁与KVO底层实现,这些基础机制共同决定了App的稳定性与性能表现。无论是应届生准备校招笔试,还是工作数年的开发者回补基础,围绕核心模块的系统梳理都能显著提升问题排查与架构设计能力。本文以小红书2020年校招iOS笔试题为线索,逐题剖析其背后的原理与答题思路,帮助读者建立完整的i 阅读详情

相关推荐

C++元编程实例:使用boost::hana::metafunction_class

在本文中,我们介绍了boost::hana::metafunction_class的使用方法,并通过一个示例程序演示了类型转换的过程。通过使用boost::hana::metafunction_class和boost::hana::to,我们成功地定义了一个元函数类并进行了类型转换。我们使用boost::hana::metafunction_class宏来定义元函数类。在本文中,我们将介绍如何使用boost::hana::metafunction_class来创建元函数类,并使用它进行类型转换和计算。

2301_79326588的博客 182

c++ 根据类名实现类的实例

学习网址:c++ 实现类注册机制的方法 https://blog.youkuaiyun.com/think_think_think/article/details/52664643

willis 662

原神真端,原神服务端,虚拟机启动部署傻瓜式教学

没玩过抽卡 游戏想体验一下抽卡的感觉,听说原神有真端了,所以弄一个局域网的服务体验一下,这里要感谢一些服务端的分享者。

azyouyouyou的博客 1万+

C++反射机制(通过类名获取类对象指针)

1、通过单例模式创建对象; 2、注册类将对象和类名称存储都map,并且提供获取类对象的函数; 3、通过宏将对象和类名注册到map中; classFactory.h #pragma once //工厂类的定义 #include<map> #include<string> using namespace std; typedef void* (*PTRCre...

lxn18392641463的博客 2965

工业音频故障检测:从CNN到Transformer的技术演进

音频信号处理是工业设备预测性维护的核心技术之一,通过分析设备运行时产生的声波特征实现故障预警。传统方法依赖梅尔频率倒谱系数(MFCC)等手工特征,而深度学习技术尤其是Transformer架构,通过自注意力机制突破了CNN在跨频段特征提取上的局限。Audio Spectrogram Transformer(AST)等先进模型在工业场景中展现出91.2%的高召回率,显著优于传统方案。这种非接触式监测技术结合边缘计算优化,已成功应用于石油化工、电力能源等领域,实现提前72小时预测轴承故障,单项目可避免数百万元的

weixin_30467861的博客 327

贝塞尔曲线在机器人路径平滑中的实战应用与优化

本文深入探讨了贝塞尔曲线算法在机器人路径平滑中的核心应用。通过对比G1CBS与G2CBS两种方法,详细阐述了如何实现从切线连续到曲率连续的平滑优化,以满足不同机器人对运动平稳性和效率的需求,并提供了完整的Python代码实现与关键参数调优指南。

weixin_29051811的博客 307

超类与子类(Superclass & Subclass)

Q: 我看了WINX开发包中的文档中,你提到了超类,它是什么概念?我平常只听过子类(Subclass)。 A: 子类化(Subclass)是指替换窗口过程(WNDPROC)。     超类(Superclass)是替换窗口过程(WNDPROC),并且替换ClassName。    Subclass不太象继承,而像是一种外挂(Hook)行为。    Superclass则更像继承,因为生成了

feimashenhua的专栏 3014

LVGL与STM32的理解(基于正点原子资料)

我们要在lcd_draw_fast_rgb_color里面实现对屏的具体操作(也就是在这里实现自己的代码)。lcd_set_window、lcd_write_ram_prepare、lcd_wr_data这三个函数是本例程LCD屏的控制函数(也就是自己写的函数)。以下是stm32工程的文件目录,GUI_APP也可以忽略(细节参考正点原子例程):这里主要是再次加强一下印象,主要就是把。,里面的lcd_init()与lcd_display_dir是。它们都是LVGL的接口,按照它们的需求,把内容给它们即可。

weixin_39257775的博客 3437

对class、superclass、super你了解多少?

class:获取方法调用者的类名; superclass:获取方法调用者的父类类名; super:编译修饰符,不是指针,跟const类似于关键字的作用,指向父类的标志;     本质还是拿到当前对象去掉用父类的方法; self:是一个指针,有地址;

sfjsxhb的博客 1058

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7114

HBuilderX远程开发环境配置:Windows SSH连接实操

详细介绍如何在Windows系统中通过SSH连接远程服务器,配置HBuilderX进行高效远程开发,提升编码协作效率。全程实操演示,轻松掌握hbuilderx与远程环境的无缝对接。

weixin_35751194的博客 1192

NSObject常用方法superclass,[super superclass],isMemberOfClass,isKindOfClass,isEqual,clang

大家好,我是OB! 今天结合源码来看看NSObject常用方法 首先声明两个类,Animal,Dog,继承关系如下 @interface Animal: NSObject @interface Dog: Animal 1、 [Dog class]和[dog class]一样吗? 新手还在看,老手已经开始NSLog了。 结果是一样的。看看源码就清楚了, + (Class)class { return self; } - (Class)class { return object_ge

_ 565

5、模型预测控制与分布式MPC控制结构解析

本文深入解析了模型预测控制(MPC)中的双模式预测控制及其稳定性理论,并探讨了分布式MPC的不同控制结构。内容涵盖MPC的基本公式化、性能指标、优化问题以及相关算法步骤,同时比较了集中式MPC、单层分布式MPC和分层分布式MPC的优缺点和适用场景。最后通过流程图和表格形式总结了双模式MPC的算法步骤和控制结构选择思路,并提供了操作建议,以帮助在实际工业系统中更好地应用MPC技术。

tea88的博客 169

【OC底层】OC对象本质,如 isa, super-class

Objective-C的本质 1、我们编写的Objective-C,底层现实都是C/C++,代码生成步骤如下: 2、在OC中的所有面向对象的实现,都是基于C/C++的数据结构实现的 3、将Objective-C代码转换为C\C++代码   xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出...

weixin_34320724的博客 136

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战

这篇文章分享了UE5 VR项目的性能优化经验。作者通过对比UE4和UE5的VR模板性能,发现UE5默认帧率只有45FPS,远低于UE4的100FPS。主要性能瓶颈来自Lumen全局光照、虚拟阴影贴图等新特性。文章详细列出了12项关键优化设置,包括禁用Lumen、关闭虚拟阴影、使用前向渲染等,并分析了各项调整对性能的影响程度。特别指出删除默认的VolumetricCloud可立即提升5帧。最后建议根据场景需求平衡画质与性能,对于高帧率要求的VR项目,可能需要谨慎使用UE5或关闭其部分高级渲染功能。

TxNet 1383

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NSObject‘s MetaClass 的 super_class 指向谁 ?

在 Objective-C 运行时系统中,`NSObject` 是所有类的根类。为了理解 `NSObject` 的元类(MetaClass)以及它的 `super_class` 指针指向谁,我们需要理解元类的继承关系。

侯仕奇的博客 602

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

iOS开发之isa、superclass(课程总结)

1、 instance的isa指向class class的isa指向meta-class meta-class的isa指向基类的meta-class 2、 class的superclass指向父类的class 如果没有父类,superclass指针为nil meta-class的superclass指向父类的meta-class 基类的meta-class的superclass指向基类...

坤宇的博客 359

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OC对象的本质(下)—— 详解isa&superclass指针

OC对象的本质(上):OC对象的底层实现原理 OC对象的本质(中):OC对象的种类 OC对象的本质(下):详解isa&superclass指针 ###isa指针 先总结一下我们在对象的分类一文里面分析过的问题,OC对象氛围三类 instance对象,内部包含 成员变量 特殊的成员变量isa指针 class对象,用来描述instance对象,内部包含 isa指针 superc...

RUNNING-NIUER的博客 487

selfClass 与 superClass 的区别

在 Objective-C 中,`[self class]` 和 `[super class]` 都用于获取对象的类信息,但它们在运行时的行为略有不同。理解它们的区别有助于更好地掌握 Objective-C 的消息传递机制和继承关系。

侯仕奇的博客 678

Objective-C底层原理:从消息发送到运行时API实战

在面向对象编程中,消息传递机制是实现对象间通信的核心范式。Objective-C作为一门动态语言,其消息发送机制在运行时而非编译时进行方法绑定,这赋予了它强大的灵活性和动态性。理解这一原理对于掌握iOS/macOS开发至关重要,它能帮助开发者编写更健壮、高效的代码,并应对复杂场景。通过运行时(Runtime)API,开发者可以动态地查询、修改类与对象的结构,实现诸如方法交换(Method Swizzling)、动态添加方法等高级特性。这些技术广泛应用于AOP编程、热修复、JSON模型自动转换等场景。本文以O

weixin_34218890的博客 332

UEC++ UBT/UHT及反射系统

UEC++ 知识点;

NapoleonCoder的博客 439

超类化(Superclass)和子类化(Subclass)

窗口化(windowing)实现形式有超类化(Superclass)和子类化(Subclass),下面一探究竟···子类化 Subclass子类化是在窗口实例创建之后,把其窗口过程设置为另一个用户定义窗口类的窗口过程函数,从而改变窗口行为。定义用户定义窗口即窗口子类化函数的调用者定义为子类窗口,而窗口实例所对应的窗口类为超类窗口。下面分析这一过程。template BOOL C

Wendysuly的专栏 3091

Java | 类与继承

类与继承继承的概念生活中的继承继承格式继承关键字继承特性构造器 继承的概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 生活中的继承 比如大学生、中学生、小学生都属于学生,它们的属性和行为上有差别,所以子类具有父类的一般特性也会具有自身的特性。 #mermaid-svg-iBIr7ImFXjjsHf54 .label { font-family: 'trebuchet ms', verdana, arial

weixin_44417461的博客 570

subtype,supertype 与 subclass,superclass 的异同

文章目录1. 相同点2. 不同点 1 :翻译上的区别3. 不同点 2: 适用范围的区别4. 附:实现子类型的方式5. 参考 1. 相同点 subtype 和 subclass 都表示类型体系关系中的「子类」 supertype 和 superclass 都表示类型体系关系中的「父类」(「超类」) 这里没有使用「类继承关系」,是因为实现子类型的方式,可以不采用「继承」这种方式。 2. 不同点 1 :翻译上的区别 subtype 翻译为「子类型」 subclass 翻译为「子类」 supertyp

Abracadabra的专栏 3181

Java getSuperclass和getGenericSuperclass

返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象。返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。

weixin_53545232的博客 1853

UE C++ 源码阅读分析--Super、ThisClass到底是如何实现的?

UE C++ 源码阅读分析--Super、ThisClass到底是如何实现的?

游戏码农一枚,不定时分享技术文章~ 1336
上一篇: OC中isKindOfClass与isMemberOfClass的区别,你真理解?
下一篇: iOS主线程和主队列的区别
LIN1986LIN
博客等级 码龄19年 17粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值