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

从基类指针访问派生类

是面向对象编程中的一个重要概念。在C++中,可以通过基类指针或引用来访问派生类的成员函数和成员变量。

当一个派生类对象被赋值给一个基类指针时,只有基类部分的成员和方法可见。这是因为基类指针只能访问派生类对象中与基类相关的部分。这种行为被称为"切片",即只保留了派生类对象中与基类相关的部分。

然而,可以通过使用虚函数和动态绑定来实现从基类指针访问派生类的成员函数。当基类中的成员函数被声明为虚函数时,派生类可以重写这些函数。通过使用基类指针或引用调用虚函数时,实际调用的是派生类中重写的函数。

这种机制称为多态性,它允许在运行时根据对象的实际类型来确定调用的函数。通过多态性,可以实现基类指针或引用调用派生类的特定函数,而无需知道对象的具体类型。

从基类指针访问派生类的优势在于可以实现代码的灵活性和可扩展性。通过使用基类指针或引用,可以编写通用的代码,而不需要针对每个派生类编写特定的代码。这样可以减少代码的重复性,并且在需要添加新的派生类时,不需要修改已有的代码。

在实际应用中,从基类指针访问派生类常用于实现多态性和对象的动态创建。通过将派生类对象赋值给基类指针,可以实现对不同类型的对象进行统一的操作和管理。

腾讯云提供了一系列与云计算相关的产品,包括云服务器、云数据库、云存储等。这些产品可以帮助用户快速构建和部署云计算应用。具体的产品介绍和链接地址可以在腾讯云官方网站上找到。

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

相关·内容

基类和派生类

1.什么是基类?   在面向对象设计中,被定义为包含所有实体共性的class类型,被称为“基类”。-百度百科   简单理解,即父类(相对派生类) 2.什么是派生类?   ...利用继承机制,新的类可以从已有的类中派生。那些用于派生的类称为这些特别派生出的类的“基类”。   简单理解,即子类(相对基类) 3.两者关联   基类和派生类是一个相对的关系。...基类和派生类反映了类与类的继承关系,是相对而言的。基类又称父类,是被派生类继承的类。派生类又称子类,是从一个已有类的基础上创建的新类,新类包含基类的所有成员,并且还添加了自己的成员。...4.实际例子   假设有两个类A和B,A和B都需要实现一个打印的功能,原始的做法是A写一个打印函数,B也写一个打印函数。两个类还好可以写,但多了就特别麻烦。...这个时候我们就可以写一个类C,C里面写一个打印函数。A和B分别继承C,这样A和B就不要写打印函数了。这样即节省了代码,又优化了结构。 上面的情况,C是A和B的基类,A和B是C的派生类。

98740
  • C++中派生类对基类成员的访问形式

    C++中派生类对基类成员的访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对基类继承来的成员的访问。 2、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。...今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类的成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数直接访问它们。...基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类中的private成员。

    2.4K70

    c++-基类与派生类

    浏览量 1 友元函数必须在类中进行声明而在类外定义,声明时须在函数返回类型前面加上关键字friend。友元函数虽不是类的成员函数,但它可以访问类中的私有和保护类型数据成员。...下面我们从成员函数的角度来讲述重载和覆盖的区别。 成员函数被重载的特征有: 相同的范围(在同一个类中);2) 函数名字相同;3) 参数不同;4) virtual关键字可有可无。...覆盖的特征有: 不同的范围(分别位于派生类与基类);2) 函数名字相同;3) 参数相同;4) 基类函数必须有virtual关键字。...隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。...2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

    39020

    基类派生类多态虚函数?

    通常在层次关系的根部有一个基类,其他类则直接或间接的从基类继承而来,这些继承得到的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。...成员函数与继承派生类可以继承其基类的成员, 然而有时候派生类必须对其重新定义。派生类需要对这些操作提供自己的新定义以覆盖从基类继承而来的旧定义。...派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员。 和其他使用基类的代码一样,派生类能访问公有成员,而不能访问私有成员。...不过在某些时候基类中还有这样一种成员,基类希望它的派生类有权访问该成员,同时禁止其他用户访问。我们用受保护的(protected)访问运算符说明这样的成员。...现在,我们只需知道访问说明符的作用是控制派生类从基类继承而来的成员是否对派生类的用户可见。 如果一个派生是公有的,则基类的公有成员也是派生类接口的组成部分。

    19520

    c++继承 基类 派生类 虚函数

    参考链接: C++继承 继承    类和类的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父类中的一些东西,父类也称为基类,子类也称为派生类。派生类继承了基类除构造函数以外的所有成员。 ...基类中不同访问限定符下(public、protected、private)的成员以不同的继承方式继承,在派生类中的访问限定也不同,具体如下:  基类的布局优先于派生类  #include基类的构造函数 2.调用派生类的构造函数 派生类的析构可想而知: 1.调用派生类的析构函数 2.调用基类的析构函数  虚函数  如下程序:  class Base { public:     Base...基类中含有虚函数,那么基类布局中存在一个虚函数指针,指向虚函数表;且其派生类中与其同名同参的函数不需要加virtual也是虚函数。...此时基类和派生类的布局如下:     vfptr的指针大小为4(32位机器)。因此基类字节数为8,派生类为12。

    1.1K20

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

    当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。...基类和派生类 一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。...C# 中创建派生类的语法如下: 访问修饰符符> class 基类> { ... } class 派生类> : 基类> { ... } 假如一个基类是Shape,一个派生类是Rectangle...派生类继承了基类的成员变量和成员方法。...Console.ReadKey(); } } } } 结果: 成本:1732.5 C# 多重继承 多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能

    4.6K20

    【c++】继承学习(一):继承机制与基类派生类转换

    这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它 我们前面知道,类里面可以访问它的成员,但是private继承下,子类是无法访问父类的成员的...继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强 2.基类和派生类对象赋值转换 派生类对象可以赋值给基类的对象 / 基类的指针 / 基类的引用...无法访问,因为_No是Student特有的成员,即使它实际上存在于sobj中 即使我们通过基类引用或指针操作对象,派生类对象的完整信息(所有成员变量和函数)仍然都在内存中,没有丢失。...使用引用和指针时不会发生切片 对象切片的问题仅在派生类对象被赋值给另一个基类类型的对象时才会发生,比如当派生类对象被传值给一个基类对象的函数参数,或者通过赋值构造一个新的基类对象。...在使用引用或指针时,这种情况并不会发生 基类对象不能赋值给派生类对象 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。

    37910

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

    二、转换的本质 派生类可以转换为基类的本质是: ①为什么派生类可以转换为基类:派生类从基类而来,因此派生类中包含了基类的方法和成员。...此时基类可以通过指针或引用指向派生类(相当于将派生类从基类中继承的那部分方法和成员绑定到基类上了,相当于派生类被截断了),然后基类就可以将派生类假装是一个基类对象来使用(调用其中的成员/方法) ②为什么基类不能转换为派生类...如果将一个基类对象绑定到派生类的指针/引用上,此时派生类通过指针/引用访问自己新定义的成员/方法时,发现找不到(因此不能将基类转换为派生类) 例如:下面B继承于A,子类继承于父类,同时为父类的成员开辟了空间...,那么调用的时候也取决于左边的类型 转换之后,基类只能通过派生类访问属于自己(基类)的那一部分,而不能访问属于派生类的数据成员(见下面演示案例③) 虚函数的调用是个例外:虚函数的调用是取决于指针或引用所指向的类型.../引用指向于派生类的情况下才会发生,此处基类是普通对象,而不是引用/指针,因此访问的还是A中的show2()函数 ?

    1.8K10

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

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

    9210

    C++中派生类成员的访问属性

    以下是摘自谭浩强《C++面向对象程序设计》一书中的内容: 在派生类中,对基类的继承方式可以有public(公用的)、private (私有的)和protected(保护的)3种。...不同的继承方式决定了基类成员在派生类中的访问属性。...简单地说: (1)  公用继承(public inheritance) 基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。...(2)  私有继承(private inheritance) 基类的公用成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。...(3)  受保护的继承(protected inheritance) 基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。

    1.1K40

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

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

    1.5K00

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

    ,取基类指针一定是偏移的。....从而就导致了基类的析构函数被调用了,而派生类的析构函数没有调用这个问题发生....Draw(int) 的虚函数,于是查找基类是否定义了Draw(int),还是没有,就出错了,从出错提示也可以看出来:“IRectangle::Draw”: 函数不接受 1 个参数。...因为此时基类是空类1个字节,派生类有虚函数故有vptr 4个字节,基类“继承”的1个字节附在vptr下面,现在的p 实际上是指向了附属1字节,即operator delete(void*) 传递的指针值已经不是...将基类析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个虚函数,基类大小就为一个vptr ,此时基类和派生类大小都是4个字节,p也指向派生类的首地址,问题解决,参考规则3。

    1K20

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

    五条基本规则: 1、如果基类已经插入了vptr, 则派生类将继承和重用该vptr。...,取基类指针一定是偏移的。...Draw(int) 的虚函数,于是查找基类是否定义了Draw(int),还是没有,就出错了,从出错提示也可以看出来:“IRectangle::Draw”: 函数不接受 1 个参数。...因为此时基类是空类1个字节,派生类有虚函数故有vptr 4个字节,基类“继承”的1个字节附在vptr下面,现在的p 实际上是指向了附属1字节,即operator delete(void*) 传递的指针值已经不是...将基类析构函数改成虚函数,fun() 最好也改成虚函数,只要有一个虚函数,基类大小就为一个vptr ,此时基类和派生类大小都是4个字节,p也指向派生类的首地址,问题解决,参考规则3。

    98600

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

    对象 B 不但 A 对象能访问,其他需要用它的对象也可以使用。 指针对象可以使用多态的特性,基类的指针可以指向派生链的任意一个派生类。...---- — 3 — 派生类覆盖其他成员 派生类(子类)可以定义一个和基类(父类)成员同名的成员,这叫「覆盖」。 在派生类(子类)中访问这类成员时,默认的情况是访问派生类中定义的成员。...) { nPublic = 1; // OK nProtected = 1; // error nPrivate =1; // ok,访问从基类继承的...protected、private 成员对于派生类成员的权限说明: 基类的 protected 成员 基类的 private 成员 派生类的成员函数可以访问当前对象的基类的保护成员 不能被派生类成员访问...,因为基类的私有成员是无法被派生类访问的,也就无法初始化。

    59930

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

    继承 在层次关系根据的类被称为基类bsae class,其他类则直接或间接地从基类继承而来,这些继承得到的类称为派生类derived class。...成员函数如果没被声明成虚函数,那么其解析过程发生在编译时而不是运行时 派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员(派生类可以访问公有成员,但是不能访问私有成员...有一点需要注意的是,即使一个基类指针或者引用绑定在一个派生类对象上,我们也不能执行从基类到派生类的转换: Bulk_quote bulk; Quote *itemP = &bulk; //...3.4 存在继承关系的类型之间的转换规则 要想理解在具有继承关系的类之间发生的类型转换,有三点特别重要: 从派生类向基类的类型转换只对指针或者引用类型有效 基类向派生类不存在隐式类型转换 和任何其他成员一样...虚函数与作用域 从名字查找先于类型检查我们可以得知为什么基类和派生类中的虚函数为什么必须有相同的形参列表了。

    1.2K20

    解锁C++继承的奥秘:从基础到精妙实践(下)

    5.1 多继承 多继承是指一个派生类可以继承多个基类。派生类可以同时继承基类的所有属性和方法。在多继承的情况下,派生类从多个基类获得特性。...六、多继承的指针偏移问题 在C++的多继承中,指针偏移问题是指当使用基类指针指向派生类对象时,由于多继承导致内存布局复杂化,必须调整指针来正确访问派生类对象中的基类部分。...这意味着派生类对象中的虚拟基类部分可能不在派生类对象的开头,而是通过指针间接访问。...虚基表中记录了虚拟基类的偏移量,编译器通过该表来计算实际的内存地址。 汇编中的虚基表查找流程: 获取vbptr:从派生类对象中读取 vbptr,该指针指向 vbtable。...] -> 虚基表(vbtable) [b] A::a(通过 vbptr 指向的位置访问) 7.3 汇编视角 从汇编的角度来看,虚拟继承会增加额外的指针操作,特别是在访问基类成员时。

    6510

    第 15 章 面向对象程序设计

    派生类应该遵循基类的接口,通过调用基类的构造函数来初始化那些从基类中继承而来的成员。派生类的初始化过程大致为:基类初始化——>基类构造函数体——>派生类初始化——>派生类构造函数体。...对于基类中定义的静态成员,因为它属于基类类型,而不是基类对象,则在整个继承体系中只存在该成员的唯一定义。不论从基类中派生出来多少个派生类,对于每个静态成员来说都只存在唯一的实例。...即使一个基类指针或引用已经绑定在一个派生类对象上,也不能执行从基类向派生类的转换。可以使用 dynamic_cast执行运行时安全检查或 static_cast来强制覆盖掉编译器的检查工作。...基类的友元在访问派生类成员时不具特殊性,类似的,派生类的友元也不能随意访问基类的成员。但是基类的友元是可以访问内嵌在派生类对象中的基类成员。...通过一条注明了(直接)基类名的 using声明语句,派生类可以从基类继承构造函数。

    1K30

    【C++】模板继承多态

    在继承结构中,派生类从基类可以继承过来private的成员,但是派生类却无法直接访问。 protected和private的区别?...在基类中·定义的成员,想被派生类访问,但是不想被外界访问,那么在基类中,把相关成员定义成protected保护的,如果派生类和外部都不打算访问,那么在基类中,就把相关成员定义成private私有的 默认继承方式...: class定义派生类,默认继承方式就是private私有的 struct定义派生类,默认方式就是public 派生类从继承可以继承所有的成员(变量和方法),除过构造函数和析构函数 派生类怎么初始化从基类继承来的成员变量呢...通过调用·基类相应的构造函数来初始化 派生类的构造函数和析构函数,负责初始化和清理派生类部分 派生类从基类继承来的成员的初始化和清理谁来负责?...是由基类的构造和析构来负责 派生类对象构造和析构的过程是: 派生类调用基类的构造函数,初始化从基类继承来的成员。 调用派生类自己的构造函数。

    10510
    领券