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

使用基类指针查找派生类对象的大小

在C++中,使用基类指针查找派生类对象的大小是不可行的。因为基类指针不能直接访问派生类对象的大小,因为它不包含派生类对象的信息。

如果您想要查找派生类对象的大小,您可以使用以下方法之一:

  1. 使用 sizeof 运算符:sizeof(派生类对象) 将返回派生类对象的大小。
  2. 使用虚函数:在基类中添加一个虚函数,如 virtual size_t getSize() const = 0;,然后在派生类中重写该函数,返回派生类对象的大小。

例如:

代码语言:cpp
复制
class Base {
public:
    virtual size_t getSize() const = 0;
};

class Derived : public Base {
public:
    virtual size_t getSize() const {
        return sizeof(Derived);
    }
};

int main() {
    Base* basePtr = new Derived();
    size_t derivedSize = basePtr->getSize();
    delete basePtr;
    return 0;
}

在这个例子中,getSize() 函数在基类中声明为虚函数,并在派生类中重写,以便返回派生类对象的大小。通过使用基类指针 basePtr,我们可以调用 getSize() 函数来获取派生类对象的大小。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中派生类成员访问形式

C++中派生类成员访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对继承来成员访问。 2、对象访问:在派生类外部,通过派生类对象对从继承来成员访问。...private成员在私有派生类中是不可直接访问,所以无论是派生类成员还是通过派生类对象,都无法直接访问从继承来private成员,但是可以通过提供public成员函数间接访问。...但是,外部使用者只能通过派生类对象访问继承来public成员。... 当继承方式为保护继承时,public成员和protected成员被继承到派生类中都作为派生类protected成员,派生类其它成员可以直接访问它们,但是外部使用者不能通过派生类对象访问它们...private成员在私有派生类中是不可直接访问,所以无论是派生类成员还是通过派生类对象,都无法直接访问private成员。

2.3K70

派生类中虚函数和非虚函数继承效果

,这里是Animal指针指向,所以他就调用Animal里面的,普通函数是父为子类提供“强制实现”,也就是只要是父指针调用普通函数,那就是父普通函数 而虚函数作用,主要是为了让父指针可以调用子类函数...,这种是在运行时才决定调用哪个函数 1、虚函数:   C++虚函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父虚函数实现子类特殊化。 2、纯虚函数:   C++中包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系中,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

7610

C++:43---派生类转换、静态动态变量

此时可以通过指针或引用指向派生类(相当于将派生类中继承那部分方法和成员绑定到上了,相当于派生类被截断了),然后就可以将派生类假装是一个对象使用(调用其中成员/方法) ②为什么不能转换为派生类...如果将一个对象绑定到派生类指针/引用上,此时派生类通过指针/引用访问自己新定义成员/方法时,发现找不到(因此不能将转换为派生类) 例如:下面B继承于A,子类继承于父,同时为父成员开辟了空间...三、继承方式对类型转换影响 遵循下面3个规则: 假设B继承于A ①只有当B公有地继承A时,用户代码才能使用派生类转换;如果B是受保护/私有的继承于A,则不能使用派生类转换 因为保护或者私有继承...,因为其只能与自己类型一致对象绑定到一起 演示案例 当我们使用引用(或指针)时,我们并不清楚该引用(或指针)所绑定对象真实类型,该对象可能是对象,也可能是派生类对象。...函数 打印“B:show2”:因为show2()函数为虚函数,所以根据虚函数性质,使用指针访问子类时,访问虚函数跟指针所指对象类型有关,此处指针所指类型为B,因此访问Bshow2()函数

1.7K10

PHP面向对象-继承和派生类定义(一)

继承定义继承是一种面向对象编程机制,它允许一个新从现有的中继承属性和方法。在继承中,现有的称为父或超,新称为子类或派生类。...子类继承了父属性和方法,并且可以添加自己属性和方法,或者覆盖继承方法。在PHP中,使用extends关键字实现继承。...在上面的示例中,我们定义了一个Animal,它有一个name属性和一个speak()方法。然后我们定义了一个Dog,它继承了Animal,并添加了一个bark()方法。...我们创建了一个Dog对象,并设置了name属性为Fido,然后调用了Dog对象speak()和bark()方法。在Dog中,我们使用extends关键字来指定Animal作为父。...子类继承了父name属性和speak()方法,可以直接使用它们。子类还添加了一个新bark()方法,它是子类自己方法。

41320

后台开发:核心技术与应用实践 -- C++

同时,无论哪一种继承方式,在派生类中是不能访问私有 成员,私有成员只能被本类成员函数所访问,毕竟派生类不是同一个 构造派生类对象时,必须对数据成员、新增数据成员和成员对象数据成员进行初始化...派生类构造函数必须对这3成员进行初始化,其执行顺序是这样: 先调用构造函数; 再调用子对象构造函数; 最后调用派生类构造函数体 当派生类有多个时,处于同一层次各个构造函数调用顺序取决于定义派生类时声明顺序...在执行派生类析构函数时,系统会自动调用析构函数和子对象析构函数,对和子对象进行清理。...而 虚函数 作用是允许在派生类中重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数。...虚函数声明方式: virtual 返回类型 函数名(); 当把某个成员函数声明为虚函数后,就允许在其派生类中对该函数重新定义,赋予它新功能,且可以通过指向指针指向同一族中不同类对象,从而调用其中同名函数

1.3K10

掌握了多态特性,写英雄联盟代码更少啦!

派生类指针」可以赋给「指针」; 通过指针调用派生类同名「虚函数」时: 若该指针指向一个对象,那么被调用是 虚函数; 若该指针指向一个派生类对象,那么被调用 派生类虚函数...— — || 03 多态表现形式二 派生类对象可以赋给「引用」 通过引用调用派生类同名「虚函数」时: 若该引用引用是一个对象,那么被调 用是虚函数; 若该引用引用是一个派生类对象...多态函数调用语句被编译成一系列根据指针所指向(或引用所引用对象中存放虚函数表地址,在虚函数表中查找虚函数地址,并调用虚函数指令。...那么在多态情景下,通过指针删除派生类对象时,通常情况下只调用析构函数,这就会存在派生类对象析构函数没有调用到,存在资源泄露情况。...解决办法:把析构函数声明为virtual 派生类析构函数可以 virtual 不进行声明; 通过指针删除派生类对象时,首先调用派生类析构函数,然后调用析构函数,还是遵循「先构造,后虚构

51310

再探虚函数

函数模板使用 动态多态 在函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象实际类型来调用相应函数,如果对象类型是派生类,就调用派生类函数,如果对象类型是,...如果说,抽象无法实例化对象,那就无法使用对象方法了嘛。...只有在析构函数定义为虚函数时,调用操作符delete销毁指向对象指针时,才能准确调用派生类析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...3、虚函数表存储虚函数地址,即虚函数表元素是指向成员函数指针,而中虚函数个数在编译时期可以确定,即虚函数表大小可以确定,即大小是在编译时期确定,不必动态分配内存空间存储虚函数表。...多态函数调用语句被编译成根据指针所指向(或引用所引用对象中存放虚函数表地址,在虚函数表中查找虚函数地址,并调用虚函数一系列指令。

86620

深入浅出C++虚函数vptr与vtable

深入浅出C++虚函数vptr与vtable 1.基础理论 为了实现虚函数,C ++使用一种称为虚拟表特殊形式后期绑定。该虚拟表是用于解决在动态/后期绑定方式函数调用函数查找表。...首先,每个使用虚函数(或者从使用虚函数派生)都有自己虚拟表。该表只是编译器在编译时设置静态数组。虚拟表包含可由对象调用每个虚函数一个条目。...与this指针不同,this指针实际上是编译器用来解析自引用函数参数,vptr是一个真正指针。 因此,它使每个对象分配大一个指针大小。这也意味着vptr由派生类继承,这很重要。...Base &pp = ptr; // 引用指向实例 Base &p = d; // 引用指向派生类实例 cout<<"对象直接调用"<<endl; ptr.fun1...例如,上述通过指针指向派生类实例,并调用虚函数,将上述代码简化为: Base *pt = new Derived(); // 指针指向派生类实例 cout<<"指针指向派生类实例并调用虚函数

4.1K30

C++:13---多态和虚函数表

多态意思为“以一个public指针/引用,寻址一个派生类对象”。 “多态”关键在于通过指针或引用调用一个虚函数时,编译时不确定到底调用还是派生类函数,运行时才确定。...这是如何实现呢? 请看下面的程序,该程序演示了多态对象存储空间大小。...每一个有虚函数(或有虚函数派生类)都有一个虚函数表,该类任何对象中都放着该虚函数表指针(可以认为这是由编译器自动添加到构造函数中指令完成)。...图2:B对象存储空间以及虚函数表 多态函数调用语句被编译成根据指针所指向(或引用所引用对象中存放虚函数表地址,在虚函数表中查找虚函数地址,并调用虚函数一系列指令。...由以上过程可以看出,只要是通过指针引用调用虚函数语句,就一定是多态,也一定会执行上面的查表过程,哪怕这个虚函数仅在中有,在派生类中没有。

70420

指针偏移?多态数组? delete 指针 内存泄漏?崩溃?

]))(p, arg-list); 其中p是指针,vptr是p指向对象隐含指针,而slotNum 就是调用虚函数指针在vtable 编号,这个数组元素索引号在编译时就确定下来, 并且不会随着派生层增加而改变...,取指针一定是偏移。...如果没有这样做的话,只会输出 析构函数,这种输出情况通过比对规则2也可以理解,pI 现在虽然指向派生类对象首地址,但执行pI->~IRectangle() 时 发现不是虚函数,故直接调用, 假如在派生类析构函数内有释放内存资源操作...因为此时是空1个字节,派生类有虚函数故有vptr 4个字节,“继承”1个字节附在vptr下面,现在p 实际上是指向了附属1字节,即operator delete(void*) 传递指针值已经不是...将析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个虚函数,大小就为一个vptr ,此时派生类大小都是4个字节,p也指向派生类首地址,问题解决,参考规则3。

1K20

指针偏移?多态数组? delete 指针 内存泄漏?崩溃?

]))(p, arg-list); 其中p是指针,vptr是p指向对象隐含指针,而slotNum 就是调用虚函数指针在vtable 编号,这个数组元素索引号在编译时就确定下来, 并且不会随着派生层增加而改变...,取指针一定是偏移。...如果没有这样做的话,只会输出 析构函数,这种输出情况通过比对规则2也可以理解,pI 现在虽然指向派生类对象首地址,但执行pI->~IRectangle() 时 发现不是虚函数,故直接调用, 假如在派生类析构函数内有释放内存资源操作...因为此时是空1个字节,派生类有虚函数故有vptr 4个字节,“继承”1个字节附在vptr下面,现在p 实际上是指向了附属1字节,即operator delete(void*) 传递指针值已经不是...将析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个虚函数,大小就为一个vptr ,此时派生类大小都是4个字节,p也指向派生类首地址,问题解决,参考规则3。

95300

【笔记】《C++Primer》—— 第15章:面向对象程序设计

有些时候我们不希望派生类独有的部分被截断,则需要使用指针来调用重载函数或使用指针所指成员。...每次继承一个就会在内存中生成一个子对象,存放了成员,也正是因为这个原因派生类可以转换为。如果是对象转换到对象,那多余成员会被截断。...为了规范和可读性,最好不要利用默认控制符,显式说明比较清晰 15.6 继承中作用域 名字查找是从内到外查找,当派生类中无法找到时,就会往直接查找,以此类推 名称查找是根据编译时目标的静态类型进行查找...因此除了重载虚函数外最好不要让名称同名 假如派生类虚函数形参不同,我们就无法使用引用或指针来动态调用派生类函数了,此时两个函数将被判断为独立函数并将外层隐藏。...,对于实现内容我们一样可以使用=default简化 如果析构函数不是虚函数,则delete一个指向派生类对象指针将产生未定义行为 如果定义了虚析构函数,则一样合成移动操作将被阻止 派生类析构函数和以往一样是空函数

51320

《C++Primer》第十五章 面向对象程序设计

每个负责定义格子接口,要想与对象交互必须使用该类接口,即使这个对象派生类部分也是如此。因此派生类对象不能直接初始化成员。...但是存在继承关系是一个重要例外:我们可以把指针或者引用绑定到派生类对象上。 这意味着当使用引用(或指针)时,实际上我们并不清楚绑定对象真实类型。...即如果我们通过引用或者指针调用函数,则使用中定义默认是残,即使实际运行派生类函数版本也是如此。 如果虚函数使用哪个默认实参,那么派生类中定义默认实参最好一致。 5....在编译时进行名字查找 一个对象、引用或者指针静态类型决定了该对象那些成员是可见。...(15) << endl; 当我们希望在容器中存放具有继承关系对象时,实际上存放通常是指针(更好选择是智能指针): Q:这里为什么要使用智能指针,涉及到动态内存申请了?

1.2K20

从零开始学C++之继承(二):继承与构造函数、派生类转换

从输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...四、派生类转换 当派生类以public方式继承时,编译器可自动执行转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为对象指针 派生类对象引用自动转化为对象引用...派生类对象自动转换为对象(特有的成员消失) 当派生类以private/protected方式继承派生类对象指针(引用)转化为对象指针(引用)需用强制类型转化。...将派生类对象看成对象     //pm = &e1; // 对象指针无法转化为派生类对象指针。...; // 对象无法强制转化为派生类对象     return 0; } 五、派生类转换 对象指针(引用)可用强制类型转换为派生类对象指针(引用), 而对象无法执行这类转换.

1.5K00

C++ 一篇搞懂继承常见特性

= 对象成员变量大小 + 派生类对象自己成员变量大小 ?...空间上讲,用指针可以节省空间,免于构造 B 对象,而是只在对象中开辟了一个指针,而不是开辟了一个对象 B 大小。 效率上讲,使用指针适合复用。...对象 B 不但 A 对象能访问,其他需要用它对象也可以使用指针对象可以使用多态特性,指针可以指向派生链任意一个派生类。...指针对象,需要用它时候,才需要去实例化它,但是在不使用时候,需要手动回收指针对象资源。...d; // 派生类对象 派生类对象可以赋值给对象 b = d; 派生类对象可以初始化引用 Base & br = d; 派生类对象地址可以赋值给指针 Base * pb = & d;

58030

对象」如何准确获取对象内存大小

回顾一下对象本质 在上篇文章「对象」揭秘本质第一步中,揭秘NSObject底层数据结构,如下所示: struct NSObject_IMPL { Class isa; }; 在Xcode...class_getInstanceSize 首先,这是一个runtime提供API,用于获取实例对象所占用内存大小,返回所占用字节数。...终于看到了希望,当实例对象大小不足16个字节,系统分配给16个字节,属于系统硬性规定。...; 例如:在64位架构下,自定义一个NSObject对象,无论该对象生命多少个成员变量,最后得到内存大小都是8个字节。...在64位架构下, 系统分配了16个字节给NSObject对象(通过malloc_size函数获得); 但NSObject对象内部只使用了8个字节空间(可以通过class_getInstanceSize

4.5K10
领券