首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么....运行时类型识别,就是把我们的类名,和基类地址保存起来. 从一个链表中保存起来. 运行时类型创建就是把这个每个类的信息,在建立一张表来保存起来....创建对象的函数指针等等. 我们现在要做的就是把它在建立一张表保存起来. 1.创建链表,保存CRuntimeClass的信息 ?...所以支持动态创建的实现宏 ? 只需要用户自己的类(除了theapp),以及所有支持动态创建的类(凡是继承CWND的类都要支持动态创建) 加上声明宏和实现宏既可....使用RTTI动态创建. 1.提供根据名称创建对象的函数(在WMain) CMyObject *CreateMyObj(const char *pClsName) { //遍历 for (MyIterator

48660
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++篇】继承之巅:超越法则束缚,领略面向对象的至臻智慧

    2.4 虚基表(VBTable)与虚基类指针(VBPTR) 在虚拟继承中,编译器会在每个虚基类对象中加入一个指向虚基表(VBTable)的指针,即虚基类指针(VBPTR),用于存储偏移量信息。...通过使用 virtual 关键字,我们不仅可以避免基类的重复实例化,还可以确保派生类对象通过基类指针或引用来访问重写后的方法。...虚基表与偏移量:虚拟继承通过虚基表(VBTable)和虚基类指针(VBPTR),在运行时动态计算虚基类的位置,从而保证了多重继承中的唯一性。...5.3.1 工厂模式的应用 工厂模式利用继承机制,实现对象的动态创建和管理,是设计模式中的经典应用之一。...Product 类,我们实现了对不同产品对象的动态创建和管理。

    16110

    深入探索虚函数表(详细)

    多重继承的虚函数表:        虚函数的引入其实就是为了实现多态,现在来研究一下多重继承的虚函数表是什么样的,首先我们先来看一下简单的一般继承的代码: class Base1 { public:...,然后我们看看多重继承,也就是Derive类继承两个基类,先看一下代码: class Base1 { public: virtual void A() { cout 基类都会有自己的虚函数表,派生类的虚函数表的数量根据继承的基类的数量来定。 2. 派生类的虚函数表的顺序,和继承时的顺序相同。 3....虚函数指针和虚函数表的创建时机:        对于虚函数表来说,在编译的过程中编译器就为含有虚函数的类创建了虚函数表,并且编译器会在构造函数中插入一段代码,这段代码用来给虚函数指针赋值。...因此虚函数表是在编译的过程中创建。        对于虚函数指针来说,由于虚函数指针是基于对象的,所以对象在实例化的时候,虚函数指针就会创建,所以是在运行时创建。

    55600

    程序设计语言概述_c语言程序设计基本概念

    C语言编译,C++对象模型,MFC反射的实现。 2. JAVA的动态编译器原理, 3. 使用过javascript,Python,PHP:经历过其代码和类型在运行时的自由性 4....虚函数、虚继承:为了支持多态,这也是“面向对象”最重要的特性,使用了虚函数表和虚基类表。注意,运行时多态是通过运行时查表实现的。稍后详细说。 5. 模板:通过代码复制的方式实现。...c) 多重继承 i. 如何处理后继的base基类?由编译器判断指针类型并加上相应的偏移 d) 虚继承 i. 添加一个虚基类指针,指向共享部分 ii. iii. 这样的缺点有两个 1....虚基类的子类都要背负一个基类指针指向共享部分。如果继承了多个虚基类,还需要多个这样的指针。(Microsoft的解决方法是增加一个虚基类表,类似于虚函数表。) 2....(另,虚基类没有成员变量没有虚函数的时候会被优化。这也是JAVA可以多重继承接口interface的原因。) 4. 不要使用virtual在复杂的多继承,深层次继承中。 5.

    1.4K40

    C++面向对象程序设计_Part2

    继承的类(derived object)的一部分是基类(base part),对于要被继承的基类,它的析构函数必须是virtual,不然会出现问题,这个问题将在后面说。...继承的构造函数会首先调用基类的构造函数,然后调用自己的构造函数(由内而外)。析构则相反,先析构自己,然后再调用基类的析构函数。...,各种形状要使用多重判断,另外,当需要添加新的形状类时,又要修改条件判断代码,这是很不好的,不符合直观理解,应该像C++的虚函数一样,指针指向什么形状,就应该调用那种类型的draw。...C++支持动态绑定和静态绑定,符合下面三个条件,C++采用动态绑定,条件如下: 必须使用指针调用函数 该指针必须是向上转型 (List中定义的类型是A的指针,但可以存储C的指针,通过继承向上转型) 调用的函数必须是虚函数...而新创建了一个指针B,给的类型是指针A的类型,通过然后调用vfunc1函数,符合三个条件,是动态绑定,汇编代码的形式也不一样了,汇编表示看不懂,不过call一行连同上面几行最后的表示在c语言中的描述确实是动态绑定的描述

    52220

    深入探索虚函数表(详细)

    多重继承的虚函数表:        虚函数的引入其实就是为了实现多态,现在来研究一下多重继承的虚函数表是什么样的,首先我们先来看一下简单的一般继承的代码: class Base1 { public:...,然后我们看看多重继承,也就是Derive类继承两个基类,先看一下代码: class Base1 { public: virtual void A() { cout 基类都会有自己的虚函数表,派生类的虚函数表的数量根据继承的基类的数量来定。 2. 派生类的虚函数表的顺序,和继承时的顺序相同。 3....虚函数指针和虚函数表的创建时机:        对于虚函数表来说,在编译的过程中编译器就为含有虚函数的类创建了虚函数表,并且编译器会在构造函数中插入一段代码,这段代码用来给虚函数指针赋值。...因此虚函数表是在编译的过程中创建。        对于虚函数指针来说,由于虚函数指针是基于对象的,所以对象在实例化的时候,虚函数指针就会创建,所以是在运行时创建。

    1.3K80

    C++重要知识点小结---2

    在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向的对象类型来调用派生类的函数。...看“第一种”和“第三种”情况采用的是虚继承,那么这时候就要有这样的一个指针vptr_b_a,这个指针叫虚类指针,也 是四个字节;还要包括类a的字节数,所以类b的字节数就求出来了。...这说明:空类所占空间为1,单一继承的空类空间也为1,多重继承的空类空间还是1.但是虚继承涉及到虚表(虚指针),所以sizeof(C)的大小为4 4.多继承的构造顺序 构造对象的规则需要扩展以控制多重继承...所以必须把父类的所有变量都继承下来,这样既能保护父类的变量也能使用父类的函数。 6.继承的访问控制 继承分为公共继承、保护继承和私有继承。 在公共继承的类中,基类的每个成员在子类中保持同样的访问方式。...一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事。 保护继承与私有继承类似,继承之后的类相对于基类来说是独立的;保护继承的类对象,在公开场合同样不能使用基类的成员。

    82670

    从零开始学C++之继承(三):多重继承、虚继承与虚基类

    一、多重继承 单重继承——一个派生类最多只能有一个基类 多重继承——一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,…. {….}; 派生类同时继承多个基类的成员...,更好的软件重用 可能会有大量的二义性,多个基类中可能包含同名变量或函数 多重继承中解决访问歧义的方法: 基类名::数据成员名(或成员函数(参数表)) 明确指明要访问定义于哪个基类中的成员...二、虚继承与虚基类 当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性,可以采用虚基类来解决。...虚基类的引入 用于有共同基类的场合 声明 以virtual修饰说明基类 例:class B1:virtual public BB 作用 主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题...2、在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的默认构造函数。

    1.1K00

    轻松搞定面试中的“虚”

    虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数,达到多态的目的。 2.什么是纯虚函数,什么是纯虚类,有什么作用?...7.什么叫虚继承?有什么作用? 虚继承,就是在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类。虚继承在多重继承的时可以防止二义性。...虚拟继承与普通继承不同的是,虚拟继承可以防止出现diamond继承时,一个派生类中同时出现了两个基类的子对象。也就是说,为了保证这一点,在虚拟继承情况下,基类子对象的布局是不同于普通继承的。...为实现动态联编,编译器为每个包含虚函数的类创建一个表,称为vtable,在vtable中,编译器放置了特定类的虚函数地址,在每个带有虚函数的类中编译器会秘密地设置一个虚函数表指针,称为vptr,指向对象的...C++中一般情况下联编也是静态联编,但是一旦涉及到多态和虚拟函数就必须要使用动态联编了。 10.什么是RTTI?

    68520

    C# 继承 基类和派生类基类的初始化C# 多重继承

    当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。...基类和派生类 一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。...C# 中创建派生类的语法如下: class 基类> { ... } class 类> : 基类> { ... } 假如一个基类是Shape,一个派生类是Rectangle...多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。...与单一继承相对,单一继承指一个类别只可以继承自一个父类。 C# 不支持多重继承。但是,您可以使用接口来实现多重继承。

    4.6K20

    (以MFC框架讲解)

    ;   void* (*CreateObj)(); }; 第一个我们可以给自己的类名 第二个我们可以给父类的对象 第三个我们可以给个函数指针,而且每个类中都要实现这个函数指针.这样我们就可以保存自己的名字...m_nObjectSize;           //对象大小 UINT m_wSchema;            //版本号 CMyObject* (*m_pfnCreateObject)(); //创建对象的函数指针...CMyRuntimeClass* m_pBaseClass;    //基类 CMyRuntimeClass* m_pNextClass;    //下一个基类 void *pInit;              ...CMyDocument,        数据类 上面三个是框架类 而当我们点击类向导的时候,会自动生成的,现在是添加用户自己的类 1.CTestDoc  继承  CMyDocument 2.CTestFrom...继承  CMyMainFrom 3.CTestView继承  CMyView 既然我们了解了RTTI类型识别,那么我们就要设计,并且实现了.

    709100

    C++虚函数表深入探索(详细全面)

    可见基类中的三个指针分别指向a,b,c虚函数,而派生类中的三个指针中第一个和第三个和基类中的相同,那么这就印证了上述我们所假设的情况,那么这也就是虚函数表。...多重继承的虚函数表:        虚函数的引入其实就是为了实现多态(对于多态看到了一篇很不错的博客:传送门),现在来研究一下多重继承的虚函数表是什么样的,首先我们先来看一下简单的一般继承的代码: class...这个是单继承的情况,然后我们看看多重继承,也就是Derive类继承两个基类,先看一下代码: class Base1 { public: virtual void A() { cout 基类都会有自己的虚函数表,派生类的虚函数表的数量根据继承的基类的数量来定。 2. 派生类的虚函数表的顺序,和继承时的顺序相同。 3....虚函数指针和虚函数表的创建时机:        对于虚函数表来说,在编译的过程中编译器就为含有虚函数的类创建了虚函数表,并且编译器会在构造函数中插入一段代码,这段代码用来给虚函数指针赋值。

    20.1K168

    C++:29 --- C++继承关系下的内存布局(下)

    在单继承类层次下,每一个新的派生类都简单地把自己的成员变量添加到基类的成员变量之后 。 看看上图,C对象指针和D对象指针指向同一地址。 2.多重继承 大多数情况下,其实单继承就足够了。...回忆一下,在单继承和多重继承的情况下,内嵌的基类实例地址比起派生类实例地址来,要么地址相同(单继承,以及多重继承的最靠左基类) ,要么地址相差一个固定偏移量(多重继承的非最靠左基类) 。...当使用指针访问虚基类成员变量时,由于指针可以是指向派生类实例的基类指针,所以,编译器不能根据声明的指针类型计算偏移,而必须找到另一种间接的方法,从派生类指针计算虚基类的位置。...在微软VC++实现中,对于有虚函数的多重继承,只有当派生类虚函数覆盖了多个基类的虚函数时,才使用调整块。...所以,当覆盖非最左边的基类的虚函数时,MSC++一般不创建调整块,也不增加额外的虚函数项。

    1.3K20

    比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

    C++允许单继承、多继承、多重继承和虚继承; 在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构; C++使用虚拟继承,解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题...(1)  类属:虚函数 用父类的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,这种技术可以让父类的指针有“多种形态”; (2)  类属:模板函数 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式...C++采用的是值模型,可以创建静态对象或栈对象; 但只有通过对象引用或指向对象的指针才能实现面向对象的动态约束行为。...Safe downcasting),也就是用来决定某对象是否归属继承体系中的某个类型; C++类类型对象的动态转换机制: 1)  子类向基类的向上转型(Up Cast) 2)  基类向子类的向下转型(Down...Python允许单继承、多继承和多重继承; 在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构; 对象模型:多态 多态:是指同样的消息被不同类型的对象接收时导致不同的行为

    1.7K10

    【C++进阶篇】C++继承进阶:深入理解继承的复杂性

    7.4 虚基表(VBTable)与虚基类指针(VBPTR) 在虚拟继承中,编译器会在每个虚基类对象中加入一个指向虚基表(VBTable)的指针,即虚基类指针(VBPTR),用于存储偏移量信息。...9.1.2 尽量使用虚拟继承解决菱形继承问题 在多重继承的情况下,使用虚拟继承来消除基类实例的冗余和二义性,尤其是在菱形继承结构中,这能够避免多个基类副本带来的问题。...9.2.3 多态性 继承为多态提供了基础,尤其是当基类指针或引用指向派生类对象时,能够实现运行时动态绑定,从而根据对象的真实类型调用适当的方法。...9.3.2 多重继承 多重继承是一个类继承多个父类。它虽然能够提供更丰富的功能,但也带来了问题,尤其是二义性问题,即派生类可能会从多个父类继承相同的成员,这会导致编译器无法决定应该使用哪个成员。...虽然派生类可以继承基类的成员,但如果基类的成员是私有的,派生类无法直接访问。 9.4.5 继承的代码复杂性 虽然继承能够带来代码复用,但过度使用继承,尤其是多重继承,会使代码变得复杂、难以理解和维护。

    9410

    C++ 类使用规范建议

    使用析构函数需要注意以下几点: (1)如果基类还有虚函数,那么析构函数要申明为virtual。这么做的原因是析构类对象的时候能够动态调用析构函数,防止内存泄露。...(3)基类如果有虚函数函数,那么令析构函数为virtual。原因是保证通过基类指针能够动态的调用子类析构函数,避免内存泄露。...多重继承(Multiple Inheritance) 真正需要用到多重实现继承(multipleimplementation inheritance)的时候非常少,只有当最多一个基类中含有实现,其他基类都是以...定义:多重继承允许子类拥有多个基类,要将作为纯接口的基类和具有实现的基类区别开来。 优点:相比单继承,多重实现继承可令你重用更多代码。...; (6)优先以如下顺序来设计代码:组合>实现继承>接口继承>私有继承,子类重载的虚函数也要声明virtual关键字,虽然编译器允许不这样做; (7)避免使用多重继承,使用时,除一个基类含有实现外,

    1.9K20

    C++重要知识点小结---2

    在派生类中允许重载基类的成员函数。如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向的对象类型来调用派生类的函数。...看“第一种”和“第三种”情况采用的是虚继承,那么这时候就要有这样的一个指针vptr_b_a,这个指针叫虚类指针,也 是四个字节;还要包括类a的字节数,所以类b的字节数就求出来了。...这说明:空类所占空间为1,单一继承的空类空间也为1,多重继承的空类空间还是1.但是虚继承涉及到虚表(虚指针),所以sizeof(C)的大小为4 4.多继承的构造顺序 构造对象的规则需要扩展以控制多重继承...所以必须把父类的所有变量都继承下来,这样既能保护父类的变量也能使用父类的函数。 6.继承的访问控制 继承分为公共继承、保护继承和私有继承。 在公共继承的类中,基类的每个成员在子类中保持同样的访问方式。...一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事。 保护继承与私有继承类似,继承之后的类相对于基类来说是独立的;保护继承的类对象,在公开场合同样不能使用基类的成员。

    73270
    领券