我们有如下内存结构,派生类指针pB和基类指针pA都指向相同的位置,也就是数据c所在的位置。 如果基类有虚函数,也就是如下面代码所示的情况 #include <stdio.h> class A { public: char c; int i; virtual char getChar() const { return c; } }; class B: public A { public: int j; }; int main(...
基类指针可以new派生类对象,因为派生类对象含有基类部分,所以我们可以把派生类对象当成基类对象来用;编译器内部做了隐式的派生类到基类的转换;这种转换的好处是有些需要用到基类引用/指针地方,可以用这个派生类对象的引用/指针来代替; 2|0派生类构造函数 派生类实际使用基类的构造函数来初始化它的基类部分;基类控制基...
在C++中,基类指针可以指向派生类对象的原因主要包括:多态性体现、内存布局兼容、类型安全和开闭原则。这种特性是C++支持面向对象编程(OOP)的一个关键方面,它允许使用基类类型的指针或引用来操作派生类对象,从而实现代码的通用性和可扩展性。 详细来说,多态性体现是这一特性的核心。多态性允许我们通过基类指针调用那些在...
由于base_ptr是一个Base类指针,它只能访问Base类的成员函数,因此调用的是Base类的print函数,输出结果为“Base class print function”。 需要注意的是,虽然基类指针可以指向派生类对象,但是当使用基类指针访问派生类的成员时,只能访问基类中的成员。如果需要访问派生类中的成员,需要将基类指针转换为派生类指针。
下面是输出的结果,从结果可以看出派生类指针指向基类指针,指针地址会加4,基类指针指向派生类时,指针地址会减4。 base 200672 200676 derived base 200740 200744 Press any key to continue 下面我们看看派生类对象和基类对象的内存是如何组织的,我们在上例的基础上引入2个变量,代码如下: ...
C.152:永远不要将派生类数组的指针赋值给基类指针 Reason(原因) Subscripting the resulting base pointer will lead to invalid object access and probably to memory corruption. 作为赋值结果的基类指针的下标运算会引起无效的对象访问并可能发生内存破坏。
首先基类对象是不可以转换成派生类对象的,只有指向派生类对象的基类指针才可以转换成派生类对象指针。有...
向下转换 (派生类指针指向基类对象) 时,使用 dynamic_cast更安全;而向上转换 (基类指针指向派生类对象) 时,dynamic_cast和static_cast两者效果相同。 之所以要求有虚函数,是因为,只有存在虚函数,才有可能会出现让基类指针/引用指向派生类对象的情况,也就才有转换的意义。在运行时,该信息会存储在类的虚函数表中,以...
在派生类有同名函数的情况下 Point * pPoint; // 声明的基类指针只能指向基类 Circle * pCircle // 声明的派生类指针只能指向派生类 如果派生类没有基类的同名函数, 派生类的指针才根据继承原则调用基类的函数 虚函数 一旦定义了虚函数, 该基类的派生类中的同名函数也自动成为虚函数. ...
这就是所谓的空白基类最优化。 空类的实例大小就是类的大小,所以sizeof(a)=1字节,如果a是指针,则sizeof(a)就是指针的大小,即4字节。 class A { virtual Fun(){} }; int main(){ cout<<sizeof(A)<<endl;// 输出 4(32位机器)/8(64位机器); A a; cout<<sizeof(a)<<endl;// 输出 4(32...