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

超类成员指针在被子类访问时变为null

是指在面向对象编程中,当一个子类继承自一个超类(也称为父类或基类),并且子类中的成员函数或方法通过超类的指针或引用进行访问时,如果超类成员指针没有被正确初始化或者被赋值为null,那么在访问超类成员时会导致指针为空的错误。

这种情况可能发生在以下几种情况下:

  1. 未正确初始化超类指针:在子类的构造函数中,没有正确初始化超类指针,导致在访问超类成员时指针为空。
  2. 超类指针被重新赋值为null:在子类的成员函数或方法中,将超类指针重新赋值为null,导致在后续访问超类成员时指针为空。
  3. 超类指针被释放或销毁:在子类的析构函数或其他地方,释放或销毁了超类指针,导致在后续访问超类成员时指针为空。

为了避免超类成员指针在被子类访问时变为null的问题,可以采取以下措施:

  1. 在子类的构造函数中正确初始化超类指针:在子类的构造函数中,调用超类的构造函数,并正确初始化超类指针,确保在后续访问超类成员时指针不为空。
  2. 避免重新赋值超类指针为null:在子类的成员函数或方法中,避免将超类指针重新赋值为null,确保在后续访问超类成员时指针不为空。
  3. 注意超类指针的生命周期:在子类的析构函数或其他地方,确保超类指针的生命周期正确管理,避免在后续访问超类成员时指针为空。

总结起来,正确初始化超类指针、避免重新赋值为null以及正确管理超类指针的生命周期是避免超类成员指针在被子类访问时变为null的关键。

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

相关·内容

神奇的Runtime

其中定义了成员变量和成员方法的列表。对象通过对象的isa指针指向。 每一个本质上都是一个对象,其实是元(meteClass)的实例。元定义了方法的列表。通过的isa指针指向元。...就为 NULL....上图实线是 super_class 指针,虚线是isa指针。 有趣的是根元是NSObject,而isa指向了自己,而NSObject的为nil,也就是它没有。...简单而言:在被观察,生成派生,对于观察属性重写setter方法,然后在valuewillchange方法和valuesdidchanged方法里发出通知 1、当一个object有观察者,动态创建这个...:通知观察者 4、当一个property没有观察者,删除重写的方法 5、当没有observer观察任何一个property,删除动态创建的子类 七、Method Swizzling原理 在Objective-C

60920

聊下继承与多态的区别?

与继承相关的类型: 基:被继承的,即"父"或“”。 派生:基于基创建的新,又称“子类”。派生可以访问中所有的非私有成员。...成员的protected成员的private成员 派生方式引起的访问属性变化概括 private派生 变为private成员 变为private成员 不可见 基的非私有成员都成为派生的私有成员...protected派生 变为protected成员 变为private成员 不可见 基的非私有成员在派生中的访问属性都降一级 public派生 仍为public成员 仍为protected成员 不可见...多态实现的三个条件: ①必须是公有继承 ②必须是通过基指针或引用 指向派生对象 访问派生方法 ③基的方法必须是虚函数,且完成了虚函数的重写 例如: //tips:虚函数指在成员函数前加*...2.继承关系中,并不要求基方法一定是虚函数。而多态,要求基方法必须是虚函数。 3.多态:子类重写父的方法,使得子类具有不同的实现。且运行时,根据实际创建的对象动态决定使用哪个方法。

5.5K20
  • C++【继承】

    成员 可见,变为 public 可见,变为 protected 可见,变为 private 父的 private 成员 不可见 不可见 不可见 总结:无论是哪种继承方式,父中的私有成员始终不可被访问...;当子类成员访问成员,最终权限将会变为 访问权限与继承权限 中的较小者 两种不同的权限相遇,若可见,则在子类变为较小者 如何证明?...的情况,具体切片实现原理还后续再进行讲解 注意: 切片只在 子类->父 发生,因为父无法满足子类的需求 ---- 5、派生的中的默认成员函数 派生子类)也是 ,同样会生成 六个默认成员函数...多态 中的相关知识 ---- 6、继承与友元函数 友元关系不能被继承 场景:友元函数 Print 可以访问中的私有成员,但子类继承父后,友元函数无法访问子类中的私有成员 class Base {...对于冗余的数据位,改存指针,该指针指向相对距离 对于冗余的成员,合并为一个,放置后面,假设想使用公共的成员(冗余成员),可以通过相对距离(偏移量)进行访问 这样就解决了数据冗余和二义性问题 为何在冗余处存指针

    15210

    23.C++- 继承的多种方式、显示调用父构造函数、父子之间的同名函数、virtual虚函数  上章链接: 22.C++- 继承与组合,protected访问级别

    C++中,继承方式共有3种: public继承 -指父成员(变量和函数)访问级别,在子类中保持不变 private继承 -指父成员,在子类变为private私有成员....-也就是说子类无法访问的所有成员 protected继承 -指父的public成员 ,在子类变为protected保护成员,其它成员级别保持不变 如下图所示: ?...注意: protected继承只针对子类有效 比如当父是protected继承,则子类子类就无法访问的所有成员 一般而言,C++项目只用到public继承 显示调用父构造函数 当我们创建子类对象...,比如: Parent* p3=&c; 其实是编译器是将子类对象退化为了父对象, 从而能通过子类来赋值初始化父 所以上述的父对象(包括指针/引用)也只能访问中定义的成员....所以C++引入了虚函数概念,根据指针指向的对象类型,来执行不同类的同名覆盖成员函数,实现不同的形态 定义: 在父成员函数的返回值前面,通过virtual关键字声明,这样便能访问子类中的同名成员函数了

    3.2K90

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

    Protected继承: 基的public成员子类变为protected,只能在子类及其派生访问,外部不可访问。 基的protected成员保持为protected。...基的private成员子类不可见。 Private继承: 基的public和protected成员子类中都变为private,只能在子类内部访问,外部和其派生都不可访问。...这意味着通过基指针或引用访问派生对象,无法直接访问派生中特有的成员函数或属性。 如果基中的方法使用了虚函数(virtual),则在运行时会调用派生中的重写方法(即多态)。...作用域决定了子类可以访问哪些成员,以及如何在子类访问、覆盖或隐藏基成员。...在private继承中,基的protected成员变为private,只能在派生内部访问

    10810

    C++进阶:详细讲解继承

    Protected成员: protected成员的内部可以被访问,但在的外部不能直接访问。 派生子类)==可以访问(父)的protected==成员。...基的其他成员子类访问方式相等于Min(成员在基访问限定符,继承方式),public > protected > private 使用关键字class默认的继承方式是private,使用...基对象不能赋值给派生对象(目前是这样的) 基指针或者引用可以通过强制类型转换赋值给派生指针或者引用。但是必须是基指针是指向派生对象才是安全的。...子类和父中有同名成员子类成员将屏蔽父对同名成员的直接访问,这种情况叫隐藏,也叫重定义。...=完成基的复制 派生的析构函数会在被调用完成后自动调用基的析构函数清理基成员

    15310

    和对象-继承

    继承是面向对象三大特性之一 定义,下级别的成员除了拥有上一级的共性,还有自己的特性,就可以考虑使用继承的技术,减少代码的重复 继承的基本语法 语法:class 子类 : 继承方式 父 子类也被成为派生...保护继承 除私有内容外,都变为保护权限 私有继承 除私有内容外,都变为私有权限 父中的私有内容,三种继承方法都无法访问 class A { public: int a; protected:...,再调用子类构造函数,析构顺序与构造相反 继承同名成员处理方式 子类对象可以直接访问子类中的同名成员 子类对象加作用域可以访问到父类同名成员子类与父拥有同名的成员函数,子类会隐藏父中所有同名成员函数...,当羊驼使用数据,就会产生二义性 羊驼继承自动物的数据继承了两份,只需要一份就可以 利用虚继承,解决菱形继承的问题: 继承之前,加上关键字virtual变为虚继承 公共的父被称为虚基 class...: v-virtual b-base ptr-pointer 虚基指针指向vbtable虚基表 实际继承了两个指针,通过偏移量,找到那份唯一的数据 class D size(24):

    69000

    final 关键字与安全发布 多线程中篇(十三)

    final的通常理解 在Java中,final关键字可以用来修饰、方法和变量(包括成员变量和局部变量) 大家应该都知道final表示最终的、最后的含义,也就是不能在继续 修饰表示不能继承,修饰方法表示不能重写...当用final修饰一个,表明这个不能被继承。...final) 当final修饰方法,表示此方法不能被重写,也就是不能被子类覆盖(但是毫不影响多个重载的final方法,重载和重写不是一个概念) 注意: 如果是final并且private的方法,子类是看不到...private的,所以如果子类新写了一个看似“重写”的方法,其实是属于子类的新方法,这并不是重写了final方法 当final修饰变量,相当于一个只读变量,只能进行读取,而不能进行设置,如果是成员变量那么需要在赋值时或者构造方法中对他进行设置...使用final关键字能够使得另一个线程不会访问到处于“部分创建”的对象 因为:当构造函数退出,final字段的值保证对访问构造对象的其他线程可见 如果某个成员是final的,JVM规范做出如下明确的保证

    1.2K21

    【C++】C++核心编程部分-内存分区模型-引用-函数提高-与对象-文件操作

    ,因为是保护继承,到子类变为保护权限 m_B = 100;//父中保护权限的成员,保护继承后到了子类还是保护权限。...,私有继承后,到了子类变为私有成员 m_B = 100;//父中保护成员,私有继承后,到了子类变为私有成员 //m_C = 100;父的私有权限成员仍然访问不到 } }; void test03...继承同名成员处理方式 问题:当子类与父出现同名的成员。如何通过子类对象,访问子类或父中同名的数据呢?...当子类与父拥有同名的成员函数,子类会隐藏父中同名成员函数,加作用域可以访问到父类同名函数。...,那么父指针在释放的无法调用到子类的析构代码 解决方法:将父中的析构函数改为虚析构或者纯虚析构 虚析构和纯析构共性: 可以解决父指针释放子类对象, 都需要有具体的含函数实现 虚析构和纯虚构的区别

    1.9K00

    【C++深度探索】继承机制详解(一)

    在保护继承中,基的公有成员和保护成员在派生中都变为保护成员,私有成员不能在派生中直接访问。...在私有继承中,基的公有成员和保护成员在派生中都变为私有成员,私有成员不能在派生中直接访问。...子类和父中有同名成员子类成员将屏蔽对父类同名成员的直接访问,这种情况叫隐藏,也叫重定义。 当一个继承另一个,它可以重定义继承的成员函数或者成员变量。...✨析构函数 派生的析构函数会在被调用完成后自动调用基的析构函数清理基成员。因为这样才能保证派生对象先清理派生成员再清理基成员的顺序。...,因为子类析构是可能用到父成员的,先父后子可能会出错 所以为了保证先析构子类再析构父,编译器会在析构了子类后自动调用父的析构函数 总结如下: 默认成员函数\子类成员 内置成员 自定义成员 子类中的父成员

    7810

    《Effective Java》——读后总结

    9、使成员的可访问性最小化 隐藏内部实现细节,有效解耦各模块的耦合关系 访问级别 private:内部才可访问 package-private(缺省的):包内部的任何访问 protected:...声明该成员子类以及包内部的访问 public:任何地方均可访问 10、复合优于继承 继承打破了封装性,除非是专门为了扩展而设计的。...若在后续的发行版本中获得新的方法,并且其子类覆盖中与新方法有关的方法,则可能会发生错误。 复合:在新的中增加一个私有域,引用现有。它不依赖现有的实现细节,对现有进行转发。...如果非final实现了该常量接口,它的所有子类的命名空间都将被接口中的常量污染。 13、优先考虑静态成员 静态成员是最简单的嵌套,可以当做普通的,只是被声明在另一个的内部。...当在一项操作中混合使用基本类型和装箱基本类型,装箱基本类型会自动拆箱,如果 null 对象引用被自动拆箱,会得到空指针异常。

    1.5K10

    Java中this和super的用法总结【转】

    super super可以理解为是指向自己(父)对象的一个指针,而这个指的是离自己最近的一个父。...2.子类中的成员变量或方法与父中的成员变量或方法同名 class Country { String name; void value() { name = "China"...若不调用父方法value(),只调用父变量name的话,则父name值为默认值null。 3.引用构造函数 super(参数):调用父中的某一个构造函数(应该为构造函数中的第一条语句)。...: 它引用当前对象的直接父中的成员(用来访问直接父中被隐藏的父成员数据或函数,基与派生中有相同成员定义如:super.变量名 super.成员函数据名(实参) this:它代表当前对象名...(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与中的成员数据同名,这时需用this来指明成员变量名) 调用super()必须写在子类构造方法的第一行,否则编译不通过。

    1K00

    什么?CC++面试过不了?因为你还没看过这个!

    修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。 this 指针 this 指针是一个隐含于每一个非静态成员函数中的特殊指针。...内联函数相比宏函数来说,在代码展开,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 在中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问成员变量,宏定义则不能。...union 联合 联合(union)是一种节省空间的特殊的,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。...public 成员:可以被任意实体访问 protected 成员:只允许被子类及本类的成员函数访问 private 成员:只允许被本类的成员函数、友元或友元函数访问 继承 基(父)——> 派生(...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父继承,虚基指针也会被继承。

    3.7K50

    C语言与C++面试知识总结

    修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。 this 指针 this 指针是一个隐含于每一个非静态成员函数中的特殊指针。...内联函数相比宏函数来说,在代码展开,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 在中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问成员变量,宏定义则不能。...union 联合 联合(union)是一种节省空间的特殊的,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。...public 成员:可以被任意实体访问 protected 成员:只允许被子类及本类的成员函数访问 private 成员:只允许被本类的成员函数、友元或友元函数访问 继承 基(父)——> 派生(...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父继承,虚基指针也会被继承。

    5K41

    封装、继承、多态、重载:C++中的强大特性与代码设计

    protected(保护)访问修饰符与私有访问修饰符类似,但允许派生子类访问中的保护成员。...在继承关系中,基被称为或父,派生被称为子类。...派生的对象可以直接访问的公有成员。 私有继承(private inheritance):派生继承了基的公有成员和保护成员,但是这些成员在派生中的访问权限变为私有。...保护继承(protected inheritance):派生继承了基的公有成员和保护成员,但是这些成员在派生中的访问权限变为保护。...当通过指向基指针或引用调用虚函数,将根据实际对象的类型来选择正确的函数实现。这种动态选择函数的机制称为动态绑定(dynamic binding)。虚函数通过关键字virtual进行声明。

    38410

    精选 30 个 C++ 面试题(含解析)

    重写:当子类重新定义了父的虚函数后,父指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。...当该空白作为基,该类的大小就优化为0了,子类的大小就是子类本身的大小。这就是所谓的空白基最优化。...15、this指针调用成员变量,堆栈会发生什么变化? 当在的非静态成员函数访问的非静态成员,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。...即使你并没有写this指针,编译器在链接也会加上this的,对各成员访问都是通过this的。...; (5)在中的static成员函数属于整个所拥有,这个函数不接收this指针,因而只能访问的static成员变量。

    1.5K30

    整理了70道C语言与C++常见问答题

    = NULL) 4 结构体可以直接赋值吗 声明时可以直接初始化,同一结构体的不同对象之间也可以直接赋值,但是当结构体中含有指针成员一定要小心。...33 C++中成员访问权限 C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。...在的外部(定义的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员 34 什么是右值引用,跟左值又有什么区别?...举个例子:一个父类型的指针指向一个子类对象时候,使用父指针去调用子类中重写了的父中的虚函数的时候,会调用子类重写过后的函数,在父中声明为加了virtual关键字的函数,在子类中重写时候不需要加...当子类继承了父的时候也会继承其虚函数表,当子类重写父中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。

    3.1K01

    C++面试知识总结

    引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用。 指针在任何时候都可以改变为指向另一个对象。 引用的创建和销毁并不会调用的拷贝构造函数。...3.5 基子类的构造、析构顺序 定义一个对象先调用基的构造函数、然后调用派生的构造函数 先派生的析构后基的析构,也就是说在基的的析构调用的时候,派生的信息已经全部销毁了 3.6 深拷贝与浅拷贝的区别...  3.8 析构函数的特点 函数名称固定:~名( ) 没有返回类型,没有参数 不可以重载,一般由系统自动的调用 3.8 公有继承、私有继承、受保护的继承 公有继承,派生对象可以访问中的公有成员...,派生成员函数可以访问中的公有和受保护成员;公有继承受保护的成员,可以通过派生对象访问但不能修改。...私有继承,基成员只能被直接派生成员访问,无法再往下继承。 受保护继承,基成员也只被直接派生成员访问,无法再往下继承。

    1.7K41

    C++之继承

    1.2.2继承基成员访问方式的变化 成员/继承方式 public继承(子类) protected继承(子类) private继承(子类) 基的public成员 public protected private...基的其他成员子类访问方式 == Min(成员在基访问限定符,继承方式),public > protected > private。 4....但是必须是基指针是指向派生对象才是安全的。...在继承体系中基和派生都有独立的作用域。 2. 子类和父中有同名成员子类成员将屏蔽父对同名成员的直接访问,这种情况叫隐藏,也叫重定义。...派生的析构函数会在被调用完成后自动调用基的析构函数清理基成员。因为这样才能保证派生对象先清理派生成员再清理基成员的顺序。 5. 派生对象初始化先调用基构造再调派生构造。 6.

    10310
    领券