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

如何确定在使用指针数组时指向哪个派生类

在使用指针数组时,确定指向哪个派生类需要使用多态性。多态性允许您在运行时根据对象的实际类型来调用适当的方法。以下是一个简单的示例,说明如何在使用指针数组时确定指向哪个派生类:

代码语言:cpp
复制
#include<iostream>
using namespace std;

class Base {
public:
    virtual void display() {
        cout << "Base class display function"<< endl;
    }
};

class Derived1 : public Base {
public:
    void display() override {
        cout << "Derived1 class display function"<< endl;
    }
};

class Derived2 : public Base {
public:
    void display() override {
        cout << "Derived2 class display function"<< endl;
    }
};

int main() {
    Base* base_ptr[2];
    Derived1 d1;
    Derived2 d2;

    base_ptr[0] = &d1;
    base_ptr[1] = &d2;

    for (int i = 0; i < 2; i++) {
        base_ptr[i]->display();
    }

    return 0;
}

在这个示例中,我们有一个基类 Base 和两个派生类 Derived1Derived2。我们使用虚函数 display() 实现了多态性。我们创建了一个指向基类的指针数组 base_ptr,并将两个派生类的对象的地址分别存储在数组中。

for 循环中,我们调用 display() 函数。由于 display() 函数是虚函数,因此在运行时将根据对象的实际类型来调用适当的方法。因此,我们可以确定指针数组中的每个元素实际上指向哪个派生类。

输出将是:

代码语言:txt
复制
Derived1 class display function
Derived2 class display function

这表明指针数组中的第一个元素指向 Derived1 类,第二个元素指向 Derived2 类。

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

相关·内容

必知必会之C++多态机制

动态多态(运行时多态): 主要是通过虚函数和继承实现的,例如,基类指针指向派生类对象,并调用虚函数。在运行时,根据对象的实际类型来决定调用哪个版本的函数。这种多态性在运行时才会确定。...unsetunset父类指针指向子类对象unsetunset 在 C++ 中,可以使用父类的指针指向子类的对象,这是实现多态的一种常见方式。...下面是一个简单的示例说明了如何使用父类的指针指向子类的对象: #include // 基类 class Base { public: virtual void display...Derived derivedObj; // 使用基类指针指向派生类对象 Base* basePtr = &derivedObj; // 通过基类指针调用虚函数,实现多态...Derived derivedObj; // 使用基类指针指向派生类对象 Base* basePtr = &derivedObj; // 通过基类指针调用虚函数,实现多态

12910

C++ 面试必备:常见 C++ 面试题汇总及详细解析

当基类中的某个虚函数在派生类中被重新定义,如果派生类对象调用该函数,则会覆盖掉基类中的实现,执行派生类中的实现代码。在进行对象的多态性转换,重写非常重要。...C++基类的析构函数声明为虚函数是为了确保在通过基类的指针或引用删除派生类对象,可以正确地释放派生类对象所占用的内存。...操作的灵活性 数组名是一个常量指针,不能修改,而指针可以被重新赋值,指向其他对象。因此使用指针使用数组名更加灵活,可以在运行时动态确定指向的对象。...数组解引用 可以通过数组下标访问数组元素,也可以使用指针进行访问,但是需要注意的是,使用指针访问数组元素需要先将指针解引用,即使用 * 运算符。例如:*p 表示 p 指向的对象。...避免和减少内存泄漏和指针越界的错误,可以注意指针的长度、malloc需要确定在哪里free、对指针赋值注意被赋值指针需要不需要释放、动态分配内存的指针最好不要再次赋值、在C++中优先考虑使用智能指针

2.1K30
  • C++:28 --- C++内存布局(上)

    了解你所使用的编程语言究竟是如何实现的,对于C++程序员可能特别有意义。...一般说来,当从派生类中访问虚基类成员,应该先强制转化派生类指针为虚基类指针,然后一直使用虚基类指针来访问虚基类成员变量。这样做,可以避免每次都要计算虚基类地址的开销。 见下例。...前者一直使用派生类指针pi,故每次访问c1都有计算虚基类地址的较大开销;后者先将pi转化为虚基类指针pc,故后续调用可以省去计算虚基类地址的开销。...不管“->”操作符左边的指针表达式的类型如何,调用的虚函数都是由指针实际指向的实例类型所决定 。比如,尽管ppq的类型是P*,当ppq指向Q的实例,调用的仍然是Q::pvf()。...然而,不管指针pv指向W的数组还是WW的数组,delete[]都必须正确地释放WW或W对象占用的内存空间。

    1.1K20

    【c++】全面理解C++多态:虚函数表深度剖析与实践应用

    派生类对象当作基类对象来对待,这允许不同类的对象响应相同的消息以不同的方式,换句话说,同一个接口,使用不同的实例而执行不同操作 比如买票,普通人买票,是全价买票;学生买票,是半价买票 class...下面我们使用代码打印出虚表中的函数 这里我们用到函数指针数组来实现: 虚函数表的本质就是函数指针数组 void(*p[10])(); 这个就定义了一个函数指针数组,我们用typedef来进行优化一下:...调用就可以看出存的是哪个函数 函数写好后,关键是我如何取到它的地址?...func 使用 A 中定义的默认参数,即 1。...也就是说,虚函数的默认参数会在编译根据函数的静态类型决定,而函数的动态类型会决定在运行时实际调用哪个版本的覆盖函数。

    27000

    C++关键知识点梳理

    引用只能绑定在对象上,而不能与字面量或者某个表达式的计算结果绑定在一起;const 指针 & 引用函数指针指向另一类型的对象,是对象不是别名,所以不需要定义初始化,但是未经初始化的指针容易引发运行时错误...,所以建议指针定义使用nullptr初始化。...动态内存直接管理方式:new/delete,new在自由存储空间上分配对象内存,对象使用完毕需使用delete释放new分配的对象指针指定的内存空间;delete p释放对象,delete []释放p指向数组...类设计的工具拷贝、赋值、销毁拷贝构造函数:将一个对象作为非引用实参、将一个非引用对象直接作为函数返回值、用花括号列表初始化一个数组或者一个类成员使用了拷贝构造函数。...当一个基类指针指向一个派生类对象,虚函数表指针指向派生类对象的虚函数表。当调用虚函数,由于派生类对象重写了派生类对应的虚函数表项,基类在调用时会调用派生类的虚函数,从而产生多态。

    95730

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

    ,即&a[0]; 如果使指针p,指向数组的首元素,可以进行操作:int * p=a; 或者int *p=&a[0]; 那么p++,是指向数组中的先一个元素,即a[1];   此时*p则是a[1]中所放的值...所以每次使用运算符new动态分配内存,都应测试new的返回指针值,以防分配失败。...如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,此时必须自定义拷贝构造函数,为创建的对象分配堆空间。 16.类成员函数的重载、覆盖和隐藏区别?    ...《C++程序设计教程》P352 在例子中并没有声明派生类GraduateStudent的构造函数,根据类的实现机制,派生类对象创建,将执行其默认的构造函数。...18.在运行时,能根据其类型确认调用哪个函数的能力,称为多态性,或称迟后联编,或滞后联编。编译就能确定哪个重载函数被调用的,称为先期联编。

    77191

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。...若(int *)p ,此时输出 *p,其值为a[0]的值,因为被转为int *类型,解引用时按照int类型大小来读取。 17、数组名和指针(这里为指向数组首元素的指针)区别?...在构造子类对象,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写...,派生类的虚表指针指向的是基类的虚表;当派生类对基类的虚函数重写派生类的虚表指针指向的是自身的虚表;当派生类中有自己的虚函数,在自己的虚表中将此虚函数地址添加在后面 这样指向派生类的基类指针在运行时...上述观点看似正确,其实不然,如果虚函数在编译器就能够决定将要调用哪个函数,就能够内联,那么什么情况下编译器可以确定要调用哪个函数呢,答案是当用对象调用虚函数(此时不具有多态性),就内联展开 综上,当是指向派生类指针

    2.6K40

    《逆袭进大厂》之C++篇49问49答

    int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。...若(int *)p ,此时输出 *p,其值为a[0]的值,因为被转为int *类型,解引用时按照int类型大小来读取。 17、数组名和指针(这里为指向数组首元素的指针)区别?...在构造子类对象,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写...,派生类的虚表指针指向的是基类的虚表;当派生类对基类的虚函数重写派生类的虚表指针指向的是自身的虚表;当派生类中有自己的虚函数,在自己的虚表中将此虚函数地址添加在后面 这样指向派生类的基类指针在运行时...上述观点看似正确,其实不然,如果虚函数在编译器就能够决定将要调用哪个函数,就能够内联,那么什么情况下编译器可以确定要调用哪个函数呢,答案是当用对象调用虚函数(此时不具有多态性),就内联展开 综上,当是指向派生类指针

    2K10

    剖析多态的原理及实现

    只有基类的指针或引用才能够指向不同的派生类对象,并且根据派生类对象的实际类型,决定具体调用哪个函数。...当通过基类指针调用show函数,具体调用哪个函数取决于实际的对象类型。 隐藏(Hiding) 隐藏是指在派生类中定义了一个与基类同名但非虚的函数,此时基类的同名函数会被隐藏。...虚函数表指针用来指向当前对象对应的虚函数表(虚表) 多态实现的原理 如何实现多态?...这样就是实现了指针或引用指向基类或者派生类直接调用指向类的虚函数。实现了多态。 动态绑定和静态绑定 静态绑定:编译器在编译已经确定了函数调用的地址,通常用于普通函数(不满足多态条件)。...虚函数表本质上是指向这些指令的指针数组

    10910

    面经:C++面试精品问答题总结(一)

    ; 但是,在以后的存取中,在栈上的数组指针指向的字符串(例如堆)快。...由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。 虚函数只能借助于指针或者引用来达到多态的效果。...(3)使用抽象类注意: 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。...,而且对于所指向的类型T只有一个要求,类型T的析构函数不能抛出异常(但是在实际工程的时候,在嵌入式等cpu比较弱的平台使用这些智能指针需要好好考虑一下,另外如果你不懂得如何使用这些智能指针,那就别使用它们...换句话说,test是一个int指针(int*),而&test是一个指向包含5个元素的test数组指针(int(*) [5])。 那我们可能会问,前面有关&test的类型描述是如何来的呢?

    42351

    卓筑汇C++开发面经

    3.指针和引用的区别---引用指向一个变量之后,不能再指向其他变量,但可以修改变量的值;指针就没有这样的限制,引用实质上是指针常量 4.常量指针指针常量的区别---常量指针const int *p,指向的内容不可以修改...,但是指向的变量可以改变;指针常量int * const p,指向的内容可以修改,但指向的变量不可变,始终指向同一块空间。...静态多态是通过函数重载实现的,同名函数根据不同的参数确定调用哪个函数,在编译就可以确定;运行时多态就是由基类指针或者引用指向派生类对象,调用虚函数,编译的时候无法确定调用哪个虚函数,在运行时才能确定...7.C++的标准库知道多少---我知道stl,里面有动态数组vector,双端队列deque,还有链表,集合和map 8.写C++使用的什么工具---visual studio 9.visual studio...如何调试C++程序---设置个断点,然后用调试按钮...... 10.工作时间能接受吗 11.反问 12.对求职者的一些建议---要加强动手能力,多写代码 13.期望薪资 14.有没有意向来公司,需要考虑时间吗

    29530

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

    假定狗只有一个主人,但是一个主人可以最多有 10 条狗,应该如何设计和使用「主人」类 和「狗」类呢?我们先看看下面几个例子。...对象 B 不但 A 对象能访问,其他需要用它的对象也可以使用指针对象可以使用多态的特性,基类的指针可以指向派生链的任意一个派生类。...要在派生类中访问由基类定义的同名成员,要使用作用域符号:: 下面看具体的例子: // 基类 class Father { public: int money; void func();...那么如何派生类构造函数里初始化基类构造函数呢?...---- || 03 基类与派生类指针强制转换 public 派生方式的情况下,派生类对象的指针可以直接赋值给基类指针: Base *ptrBase = & objDerived; ptrBase 指向的是一个

    59130

    多态与虚(函数)表

    前言 续接上回(继承),我们了解了继承是如何通过虚基表,来解决派生类和父类有相同的成员变量的情况,但是类和对象中可不只有成员变量,如果成员函数也有同名,更或者如果我们想在访问不同情况(类)但是相同函数名...派生类的虚函数在不加virtual关键字,虽然也可以构成重写(因 为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议 这样使用*/ /*void BuyTicket...虚函数表本质是一个存虚函数指针指针数组,一般情况这个数组最后面放了一个nullptr。 5....,前面我们说了虚函数表本质是一个存虚函数 指针指针数组,这个数组最后面放了一个nullptr // 1.先取b的地址,强转成一个int*的指针 // 2.再解引用取值,就取到了b对象头4bytes的值...,这个值就是指向虚表的指针 // 3.再强转成VFPTR*,因为虚表就是一个存VFPTR类型(虚函数指针类型)的数组

    57120

    C++之多态

    一个含有虚函数的类中都至少含有一个虚函数表指针,虚函数表指针指向一个虚函数表,虚函数表也称为虚表,虚函数的地址都被放在虚函数表中。 那么派生类中虚函数表里放了什么呢?...虚函数表的本质是一个数组,存放的是指向虚函数的指针,一般这个数组最后放的是nullptr标志该虚表结束。...导致基类的指针p是调用基类的成员函数,派生类指针p是调用派生类的成员函数。 简单来说: 普通函数调用是传谁调用谁; 符合多态的函数调用就是指向谁调用谁。...,前面我们说了虚函数表本质是一个存虚函数指针指针数组,这个数组最后面放了一个nullptr // 1.先取b的地址,强转成一个int*的指针 // 2.再解引用取值,就取到了b对象头4bytes的值...,这个值就是指向虚表的指针 // 3.再强转成VFPTR*,因为虚表就是一个存VFPTR类型(虚函数指针类型)的数组

    34640

    C++基础-多态

    分析上述例程: 派生类对象可以赋值给基类对象(这里对象是广义称法,代指对象、指针、引用),例程中使用基类引用或指针指向派生类对象 如果基类中的 Swim() 不是虚函数,那么无论基类引用(或指针)指向何种类型的对象...这种情况使用了多态机制 使用基类指针或引用指向基类或派生类对象,运行时调用对象所属的类(具有继承层次关系的基类或派生类)中的方法,这就是多态。...如果不将析构函数声明为虚函数,那么如果一个函数的形参是基类指针,实参是指向堆内存的派生类指针,函数返回作为实参的派生类指针将被当作基类指针进行析构,这会导致资源释放不完全和内存泄漏;要避免这一问题,...例程中使用统一类型(基类)的指针 pFish 指向不同类型(基类或派生类)的对象,指针的赋值是在运行阶段执行的,在编译阶段,编译器把 pFish 认作 Fish 类型的指针,而并不知道 pFish 指向的是哪种类型的对象...实例化这些类的对象,会为每个对象创建一个隐藏的指针(我们称之为 VFT*),它指向相应的 VFT。可将 VFT 视为一个包含函数指针的静态数组,其中每个指针指向相应的虚函数,如下图所示: ?

    85220

    C++面试知识总结

    1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小,还有递归函数层次过多超过了栈大小。...2.11 字符指针,浮点数指针和函数指针哪个占用内存更大 一样大,指针的占用内存大小只和机器相关。 2.12 如何引用一个全局变量 在同一文件中:直接引用。...当操作数是指针,sizeof依赖于系统的位数。 当操作数具有数组类型,其结果是数组的总字节数。 联合类型操作数的sizeof是其最大字节成员的字节数。...,派生类的成员函数可以访问基类中的公有和受保护成员;公有继承基类受保护的成员,可以通过派生类对象访问但不能修改。...私有继承,基类的成员只能被直接派生类的成员访问,无法再往下继承。 受保护继承,基类的成员也只被直接派生类的成员访问,无法再往下继承。

    1.7K41

    再探虚函数

    如果说,抽象类无法实例化对象,那就无法使用对象方法了嘛。...那我现在有一个抽象类的对象,我要调用接口,调用哪个? ---- Q5:基类的析构函数为什么要定义成虚函数?...只有在基类析构函数定义为虚函数,调用操作符delete销毁指向对象的基类指针,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.对于静态成员函数,它没有this指针,所以无法访问vptr...2、虚函数表类似一个数组,类对象中存储vptr指针指向虚函数表。

    86720

    【C++航海王:追寻罗杰的编程之路】多态你了解多少?

    派生类的虚函数在不加virtual关键字,虽然也可以构成重写(因 为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议 这样使用*/ /*void BuyTicket...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数,与基类函数返回值类型不同。即基类虚函数返回基类对象的指针或引用,派生类虚函数返回派生类对象的指针或引用时,称为协变。...虚函数表本质是一个存虚函数指针指针数组,一般情况这个数组最后面放了一个nullptr。...那么我们如何查看d的虚表呢?下面我们使用代码打印 出虚表中的函数。...的值,这个值就是指向虚表的指针 // 3.再强转成VFPTR*,因为虚表就是一个存VFPTR类型(虚函数指针类型)的数组

    8110

    如何实现?只看这一篇就够了

    派生类的虚函数在不加virtual 关键字,虽然也可以构成重写(因为继承后基类的虚函数被继承 下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范, 不建议这样使用*/...虚函数表本质是一个存虚函数指针指针数组,这个数组最后面放了一个nullptr。...观察下图的红色箭头我们看到,p是指向mike对象,p->BuyTicket在mike的虚表中找到虚函数是Person::BuyTicket。...,前面我们说了虚函数表本质是一个存虚函数指针指针数组,这个数组最后面放了一个nullptr // 1.先取b的地址,强转成一个int*的指针 // 2.再解引用取值,就取到了b对象头4bytes...的值,这个值就是指向虚表的指针 // 3.再强转成VFPTR*,因为虚表就是一个存VFPTR类型(虚函数指针类型)的数组

    1.4K10
    领券