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

为什么我不能使用subClass的指针访问基类的公共函数?

这个问题涉及到面向对象编程中的继承和多态性。在C++中,当我们使用子类的指针访问基类的公共函数时,需要确保子类确实继承了基类,并且子类中没有重写基类的公共函数。

如果子类没有继承基类,或者子类中重写了基类的公共函数,那么使用子类的指针访问基类的公共函数可能会导致编译错误或运行时错误。这是因为子类的指针可能指向一个子类对象,而子类对象可能没有基类的公共函数。

为了避免这种情况,可以使用虚函数和动态绑定来解决。虚函数是一种特殊的成员函数,它允许子类重写基类的成员函数,并且可以通过基类指针或引用来调用子类的实现。动态绑定是一种运行时机制,它允许程序在运行时确定调用哪个函数实现。

总之,为了确保使用子类的指针访问基类的公共函数时不会出现问题,需要确保子类继承了基类,并且没有重写基类的公共函数。如果需要重写基类的公共函数,可以使用虚函数和动态绑定来解决问题。

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

相关·内容

为什么要创建一个不能被实例化

但如果有一天,你发现写了这样一个: class People: def say(self): print(f'叫做:{self.name}') def __new...一个不能被初始化,有什么用? 这就要引入我们今天讨论一种设计模式——混入(Mixins)。 Python 由于多继承原因,可能会出现钻石继承[1]又叫菱形继承。...('kingname', 28) pm = People('pm', 25) kingname > pm 显然,这样写会报错,因为两个实例是不能比较大小: 但在现实生活中,当我们说 某人比另一个人大时...def __ge__(self, other): return self.age >= other.age 运行效果如下图所示: 但如果这几个魔术方法会在多个使用...People 继承它: 本质上,混入写法与普通继承没有什么区别。

3.4K10

为什么使用不了了?

前言 在调用时,如果出现错误信息 “ 当前上下文中不存在名称*** ”,这时候该如何处理,我们来一起总结一下。 错误情况1 在同一项目中使用“TestClass2”这个时出现错误。  ...【分析】:这个错误比较明显,图中将“TestClass2”写在了 “TestClass1”中,使用中是不允许出现嵌套,否则就是我们常说”,必须杜绝这样编程失误。...错误情况2 在同一项目中使用“TestClass2”这个时出现错误。 【分析】:“TestClass1”中只有一个方法,没有其他,所以不存在“情况。...错误情况3 在同一项目中使用“TestClass1”这个时出现错误。 【分析】:名称为 “TestClass1”,而使用时却将名称写成了“TestClass11”。...解决方案 将名改为 “TestClass1”即可。 错误情况4 在调用库中“TestClass”这个时出现错误。 【分析】:无法调用库中时,可能是由于没有在项目中将库引用进来。

68430

C++多态实现原理

pBaseClass->NonVirtualFunction(); return 0; } 如上示例代码,定义BaseClass,BaseClass定义了虚析构函数、虚函数VirtualFunction1...指针pBaseClass指向subClass对象,为什么调用NonVirtualFunction时不是调用subClassNonVirtualFunction方法?...指针pBaseClass指向subClass对象,为什么调用VirtualFunction1方法时,是调用subClass::VirtualFunction1呢?让我们先看下汇编代码。 ?...调用虚函数时会查询虚函数表对应函数地址,如果子类覆盖重写函数,子类函数表对应函数地址就会被编译器更新为子类函数。...子类对象地址可以赋值给(BaseClass* pBaseClass = &subClass),由于__vfptr数据成员是从继承,所以pBaseClass虽然指向SubClass对象,但是可以访问

51810

一种Android App在Native层动态加载so库方案

Java层调用Native层动态加载实现 确定动态加载方案后,Native层代码模块划分也有所修改:增加一个公共数据结构定义so库,专门存放一些通用常量和基本数据操作接口,例如一些定义,...JNI层so库操作对象,而在功能实现so库则继承这些定义实现具体操作。...由于数据结构定义需要事先获知,所以这个so库需要作为共享库被JNI层so库和功能实现so库在运行时依赖(具体表现就是在构建这些so库Android.mk文件中,把这个公共定义so库指定到LOCAL_SHARED_LIBRARIES...解决方法就是在调用方和被加载so库都静态引用公共数据定义中,定义一个虚作为操作接口。这个具体子类在被加载so库中实现,调用方使用指针操作被加载so库中子类实例。...,使用之前定义两个函数指针分别指向这两个非成员函数

6.9K60

C++设计注意事项

构造函数用来创建新对象,它是不能被派生继承,派生需要定义自己构造函数,并在初始化列表中调用构造函数SubClass::SubClass(int a, int b):BaseClass(...在定义派生赋值操作符重载函数时,要显式地在函数块中通过::来调用赋值操作符,来操作成员,毕竟派生很多时候无法直接访问成员,只能通过调用公开方法来访问,而且也不能通过初始化列表方式来调用...析构函数最好定义成虚函数(virtual),这样当释放一个指针指向派生时,也会自动先调用派生析构函数,然后才调用析构函数,否则会只调用析构函数,这样派生用new初始化成员将得不到释放...私有成员与保护成员 用private修饰为私有成员,只有对象自己可以访问,派生也不可以。用protected修饰为保护成员,对象自己可以访问,派生也可以访问,外部类不能访问。...虚函数意义是当用指针或引用指向对象时(不管指向对象还是派生对象),调用虚函数会根据对象真实类型调用对应方法。

37820

C++核心准则​讨论:将析构函数设为公共和虚拟,或受保护和非虚拟

析构函数应该是虚函数吗?也就是说,是否应该允许通过指向指针进行销毁?如果是,则base析构函数必须是公共才能被调用,否则虚拟调用它会导致未定义行为。...对于Base,调用代码可能会尝试通过指向Base指针销毁派生对象,例如在使用unique_ptr 时。...推论:编写时,请始终显式编写一个析构函数,因为隐式生成公共和非虚。如果默认函数就很好,那么您只需要决定器可见性和虚函数性,则实现可以直接使用=default。...B是可以自己实例化和具体,因此析构函数必须是公共,才能创建和销毁B对象。...但是,通常应避免使用具体(请参阅第35项)。例如,unary_function是typedef捆绑包,不能独立实例化。给它一个公开析构函数确实没有任何意义。

1.1K20

C++:多态#1虚函数

<<endl; } //.. }; 作此声明后,若有子类继承于 base 将会自动将 fun()函数性质自动继承给子类,子类 fun()虚函数关键字 virtual 可省略。...<<endl; } }; 这样函数是不恰当 void fn(int x)和子类中 void fn(float x)显然是两个不同函数,它们仅仅是同名函数重载,虽然 subClass...虚函数返回类型例外 之前提到如果与子类函数仅仅是函数名相同,参数类型不同或返回类型不同,即使加上了关键字 virtual,编译器也不会对其进行滞后联编。...但有例外情况,两个函数参数形式相同,返回类型不同,函数返回指针引用,子类中函数则返回子类指针或子类引用,其同样构成多态,这很合理,一个函数可以处理 base 对象(),也可以处理...静态成员函数不能为虚函数,因为静态成员不受限于单个对象。 内联函数不能为虚函数。 构造函数不能为虚函数。 析构函数可以是虚函数,从而适应与子类对象异同。

27010

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

2.派生可以继承所有公有和保护数据成员和成员函数。 保护访问权限对于派生来说是公有的,而对于其它对象来说是私有的。即使是派生不能访问私有的数据成员和成员函数。...在派生中允许重载成员函数。如果函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向对象类型来调用派生函数。...所以必须把父所有变量都继承下来,这样既能保护父变量也能使用函数。 6.继承访问控制 继承分为公共继承、保护继承和私有继承。 在公共继承中,每个成员在子类中保持同样访问方式。...即在中为public成员,子类中可以访问,并据为public中为protected成员,子类中也可访问之,并据为protected中为private成员,在子类中不能访问之,这就像在应用程序中不能访问中似有成员一样...一个私有的或保护派生不是子类,因为非公共派生不能能做所有的事。 保护继承与私有继承类似,继承之后相对于来说是独立;保护继承对象,在公开场合同样不能使用成员。

68570

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

2.派生可以继承所有公有和保护数据成员和成员函数。 保护访问权限对于派生来说是公有的,而对于其它对象来说是私有的。即使是派生不能访问私有的数据成员和成员函数。...在派生中允许重载成员函数。如果函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向对象类型来调用派生函数。...所以必须把父所有变量都继承下来,这样既能保护父变量也能使用函数。 6.继承访问控制 继承分为公共继承、保护继承和私有继承。 在公共继承中,每个成员在子类中保持同样访问方式。...即在中为public成员,子类中可以访问,并据为public中为protected成员,子类中也可访问之,并据为protected中为private成员,在子类中不能访问之,这就像在应用程序中不能访问中似有成员一样...一个私有的或保护派生不是子类,因为非公共派生不能能做所有的事。 保护继承与私有继承类似,继承之后相对于来说是独立;保护继承对象,在公开场合同样不能使用成员。

79270

Java Review (十、面向对象----继承)

已存在称为超( superclass)、 ( base class) 或父(parent class); 新称为子类(subclass、) 派生( derived class) 或子类(...这个关键字很好地体现了子类和父 系:子类是对父扩展,子类是种特殊 从这个意义上来看,使用继承来描述子类和父似乎不如扩展更恰当。 为什么国内把 extends 翻译为"继承"呢?...需要指出是:Java 子类不能获得父构造方法。...,因为此时系统将会访问在①行粗体字代码处定义tag 实例变量,也就是输出“公共标签”。...调用父构造器 子类是不继承父构造器(构造方法或者构造函数,它只是调用(隐式或显式)。

47830

nextline函数_在JAVA中Scanner中next()和nextLine()为什么不能一起使用

大家好,又见面了,是你们朋友全栈君。...很好实现 …… 就继续在这里记录一下 Scanner 坑吧 一、next & nextLine 区别next不能得到带有空格字符串 一定要读到有效字符后才可以结束,结束条件是碰到空格、tab 键、...: 输入 1: 2 abc cba 结果 1: str[0] = “abc” str[1] = “cba” 原因:next() 方法在遇到有效字符前所遇到空格、tab 键、enter 键都不能当作结束符...这些函数与 nextLine 连用都会有坑 坑点就是 next 系列函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用 nextLine 时候会碰到读取空字符串情况 解决方案:输入都用...nextLine ,做格式转换 输入 next 系列函数调用后,中间调用一次 nextLine 调用去掉了回车符后,再调用一次 nextLine 调用真正输入我们数据 都使用 nextLine: class

2.6K10

C#简单面试题目(一)

protected:保护成员,该类内部和继承中可以访问。   public:公共成员,完全公开,没有访问限制。   internal:在同一个程序集内可以访问....万物都是对象,其主要特征:封装、继承、多态 6.怎样实现多态   1.通过对象直接调用成员函数时,始终默认使用该对象成员函数(除非用::显示指定名)   2.通过指向对象指针或引用调用成员函数时...,如果该函数是实函数,则调用该指针或引用成员函数;如果该函数是虚函数,则调用该指针或引用指向对象成员函数。...接口成员被定义为公共,但抽象成员也可以是私有的、受保护、内部、或受保护内部成员(其中受保护内部成员只能在应用程序代码或派生访问)。...13.为什么不能指定接口中方法修饰符?   接口中方法用来定义对象之间通信契约,指定接口中方法为私有或保护没有意义。他们默认为共有方法。 14.如果接口中存在重复方法名称该如何?

95230

【Python面试】 说说Python面向对象三大特性?

答:Python是一门面向对象语言。面向对象都有三大特性:封装、继承、多态。 下面分别来说说这三大特性: 1、封装 隐藏对象属性和实现细节,仅对外提供公共访问方式。...2、继承 继承是一种创建新方式,在python中,新建可以继承一个或多个父,父又可称为或超,新建称为派生或子类。即一个派生继承字段和方法。...): #单继承,是ParentClass1,派生SubClass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承...3、多态 一种事物多种体现形式,函数重写其实就是多态一种体现 。...实现多态步骤: 1、定义新子类 2、重写对应方法 3、使用子类方法直接处理,不调用父方法 多态好处: (1)增加了程序灵活性 (2)增加了程序可扩展性

42920

继承

公有继承特点 子类可以直接访问所有公有和保护成员,其效果如同它们是在子类中声明一样 对于私有成员,在子类中存在但不能访问 在子类中定义中同名公有成员或保护成员,子类中成员会隐藏类同名成员...,想访问被隐藏成员,可以借助作用域限定符“::” 子类对象任何时候都可以被当成类型对象(皆然性 ISA) 保护继承特点 使公有成员和保护成员进行保护化,只禁止外部通过该子类访问 子类指针或引用不能隐式转换成类型指针或引用...私有继承特点 将公有和保护成员私有化,禁止外部通过该子类访问,也禁止该子类子类访问 子类指针或引用不能隐式转换成类型指针或引用 访问控制权限 访问控制限定符 访问控制属性 子类 外部.../* * 2.对于私有成员,在派生中存在但不能访问 */ //m_age = 10; } void show() { //隐藏m_show变量 m_show...中间子类有公共,导致最终子类存在多个公共,导致调用歧义通过使用::明确调用 #include using namespace std; class A { public:

67220

函数

3、 必须先使用指针指向子类型对象,然后直接或者间接使用指针调用虚函数。   ...在以该类为派生中,也不能出现这种非虚同名同返回值同参数个数同参数类型函数。   为什么函数必须是成员函数:   虚函数诞生目的就是为了实现多态,在外定义虚函数毫无实际用处。   ...为什么静态成员函数不能为虚函数:   如果定义为虚函数,那么它就是动态绑定,也就是在派生中可以被覆盖,这与静态成员函数定义(:在内存中只有一份拷贝;通过名或对象引用访问静态成员)本身就是相矛盾...虽然在上面的图中我们可以看到子类虚表中有Derive自己函数,但我们根本不可能使用指针来调用子类自有虚函数:   Base1 *b1 = new Derive();   b1->f1();...,所以我们同样可以使用访问函数方式来访问这些non-public函数,这是很容易做到

73831

C++如何让自己变得富有?

一、继承介绍: C++中继承是面向对象编程中一个重要概念,它允许一个(称为子类或派生)继承另一个(称为父公共数据和函数成员。...子类可以使用数据和函数,同时也可以添加自己数据和函数,将父功能扩展为更具体和特定功能,使代码更加模块化和易于维护。.... 3)Teacher中,显示调用了构造函数,People("wang wu",18) 三、继承方式 继承方式有三种: (1) “public”(公有继承:表示父公共成员在子类中仍然是公共...),但不能直接访问私有成员。...private成员在派生中是不能访问,如果成员不想在外直接被访问,但需要在派生中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现

13510

【Python面试】 说说Python面向对象三大特性?

下面分别来说说这三大特性: 1、封装 隐藏对象属性和实现细节,仅对外提供公共访问方式。在python中用双下划线开头方式将属性设置成私有的 。 好处:1. 将变化隔离;2. 便于使用;3....2、继承 继承是一种创建新方式,在python中,新建可以继承一个或多个父,父又可称为或超,新建称为派生或子类。即一个派生继承字段和方法。...): #单继承,是ParentClass1,派生SubClass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承...3、多态 一种事物多种体现形式,函数重写其实就是多态一种体现 。...实现多态步骤: 1、定义新子类 2、重写对应方法 3、使用子类方法直接处理,不调用父方法 多态好处: (1)增加了程序灵活性 (2)增加了程序可扩展性 如果对于参考答案有不认同,大家可以在评论区指出和补充

41030

腾讯C++后台开发面试笔试知识点参考笔记

指针可以指向派生对象(多态性),如果删除该指针delete []p;就会调用该指针指向派生析构函数,而派生析构函数又自动调用析构函数,这样整个派生对象完全被释放。...只有成员函数代码才应该使用作用域操作符覆盖虚函数机制。 为什么会希望覆盖虚函数机制?最常见理由是为了派生函数调用版本。...一般我们并不关心是哪个实际包含成员,通常只在和派生共享同一名字时才需要注意。 与成员同名派生成员将屏蔽对成员直接访问。...使用作用域操作符访问被屏蔽成员 可以使用作用域操作符访问被屏蔽成员: struct Derived : Base { int get_base_mem() { return Base::...除了作 为抽象派生对象组成部分,甚至不能创建抽象类型Disc_item对象。

96710

C++继承(多继承、菱形继承?)

可以赋值给 对象 / 指针 / 引用。...注意事项: ① 父对象不能直接赋值给子类对象 Student s; // 子类 Person p; // 父 s = p; ❌ ② 指针可以通过强制类型转换赋值给派生指针。...在子类成员函数中,可以使用如下方式进行显式访问::成员 注意: 成员函数在同一个里面可以重名,构成了重载,但是成员变量一定不能重名!...3.虚表与虚指针 上面的两个地址其实指针!称为虚指针,他们指向了两个表,叫做虚表!虚表中存是偏移量,通过这个偏移量可以在内存中找到 A 位置进行访问。...以这里第一个虚指针 0x00547b48 为例,他表里第二个位置偏移量为 0x00000014,也就是20个字节,因为这里每行是四个字节,所以也就是向下走5行,可以发现就到达了存放公共成员

1.9K20
领券