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

为什么我不能在期望父类列表的函数中引用子类列表?

在面向对象编程中,父类和子类之间存在继承关系,父类是子类的基类或超类。在期望父类列表的函数中引用子类列表是不合适的,原因如下:

  1. 类型不匹配:父类和子类虽然存在继承关系,但它们是不同的类型。父类列表中的元素是父类的实例,而子类列表中的元素是子类的实例。因此,在期望父类列表的函数中引用子类列表会导致类型不匹配的错误。
  2. 功能限制:父类是子类的抽象,它定义了一组共同的属性和方法。父类列表的函数可能只能使用父类的属性和方法,而无法使用子类特有的属性和方法。如果引用了子类列表,可能会导致函数无法正常工作或无法充分发挥子类的功能。
  3. 依赖关系混乱:在面向对象编程中,子类通常依赖于父类的实现。如果在期望父类列表的函数中引用子类列表,会导致依赖关系混乱。父类的实现可能无法正确处理子类的特殊情况,从而导致错误或不一致的行为。

综上所述,为了保持类型匹配、功能完整和依赖关系的清晰,不建议在期望父类列表的函数中引用子类列表。应该根据实际需求,选择合适的父类或子类来操作数据。

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

相关·内容

创建子类对象时,构造函数调用被子类重写方法为什么调用子类方法?

A对象时候会调用子类方法?...但是:创建B对象会调用方法? 答案: 当子类被加载到内存方法区后,会继续加载到内存。...如果,子类重写了方法,子类方法引用会指向子类方法,否则子类方法引用会指向方法引用。 如果子类重载了方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载方法,则方法引用会指向方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,构造方法调用方法参数已经强制转换为符合方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10

【Python环境】12道 Python面试题总结

为什么改变了 Parent.x 值还会改变 Child2.x 值,但是同时 Child1.x 值却没有改变? 这个答案关键是,在 Python 变量在内部是作为字典处理。...如果一个变量名字没有在当前字典中发现,将搜索祖先(比如)直到被引用变量名被找到(如果这个被引用变量名既没有在自己所在又没有在祖先中找到,会引发一个 AttributeError 异常...因此,在设置 x = 1 会使得变量 X 在引用该类和其任何子类值为 1。这就是因为第一个 print 语句输出是 1 1 1。...最后,如果该值在中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值子类当中值(在这个示例中被影响子类是 Child2)。...随后当 extendList 没有被指定列表参数调用时候,其使用是同一个列表。这就是为什么函数被定义时候,表达式是用默认参数被计算,而不是它被调用时候。

99450

12道 Python面试题总结

为什么改变了 Parent.x 值还会改变 Child2.x 值,但是同时 Child1.x 值却没有改变? 这个答案关键是,在 Python 变量在内部是作为字典处理。...如果一个变量名字没有在当前字典中发现,将搜索祖先(比如)直到被引用变量名被找到(如果这个被引用变量名既没有在自己所在又没有在祖先中找到,会引发一个 AttributeError 异常...因此,在设置 x = 1 会使得变量 X 在引用该类和其任何子类值为 1。这就是因为第一个 print 语句输出是 1 1 1。...最后,如果该值在中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值子类当中值(在这个示例中被影响子类是 Child2)。...随后当 extendList 没有被指定列表参数调用时候,其使用是同一个列表。这就是为什么函数被定义时候,表达式是用默认参数被计算,而不是它被调用时候。

1.4K90

5 道 Python 面试题

如果一个变量名字没有在当前字典中发现,将搜索祖先(比如)直到被引用变量名被找到(如果这个被引用变量名既没有在自己所在又没有在祖先中找到,会引发一个 AttributeError 异常...因此,在设置 x = 1 会使得变量 X 在引用该类和其任何子类值为 1。这就是因为第一个 print 语句输出是 1 1 1。...最后,如果该值在中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值子类当中值(在这个示例中被影响子类是 Child2)。...随后当 extendList 没有被指定列表参数调用时候,其使用是同一个列表。这就是为什么函数被定义时候,表达式是用默认参数被计算,而不是它被调用时候。...extendList 函数定义可以做如下修改,但,当没有新 list 参数被指定时候,会总是开始一个新列表,这更加可能是一直期望行为。

66180

5 个很好 Python 面试题

如果一个变量名字没有在当前字典中发现,将搜索祖先(比如)直到被引用变量名被找到(如果这个被引用变量名既没有在自己所在又没有在祖先中找到,会引发一个 AttributeError 异常...因此,在设置 x = 1 会使得变量 X 在引用该类和其任何子类值为 1。这就是因为第一个 print 语句输出是 1 1 1。...最后,如果该值在中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值子类当中值(在这个示例中被影响子类是 Child2)。...随后当 extendList 没有被指定列表参数调用时候,其使用是同一个列表。这就是为什么函数被定义时候,表达式是用默认参数被计算,而不是它被调用时候。...extendList 函数定义可以做如下修改,但,当没有新 list 参数被指定时候,会总是开始一个新列表,这更加可能是一直期望行为。

891100

【C++】多态 ② ( 面向对象 “ 多态 “ 真正需求 | 面向对象 “ 多态 “ 实现 - virtual 修饰函数 | 代码示例 )

, 实际对象类型是 Parent 类型 , 不管是 将 Parent* 指针 指向 还是 子类 , 不管是 将 Parent& 引用 指向 还是 子类 , 调用都是 函数..., 这并不是我们想要 ; 上述测试 , 根据实际 对象类型 确定 重写函数 要调用 还是 子类 函数 , 并不是我们期望 ; 多态 需求是 : 相同调用语句 , 有多种不通表现形态...关键字 , 实现对 多态支持 ; 子类 重写 函数 , 在 子类 , 使用 virtual 关键字 修饰 该函数 , 即可实现 多态 特性 ; 在 , 使用 virtual...关键字 修饰 函数 , 子类重写该函数时 , 可以不使用 virtual 关键字 ; 在开发时 , 建议 子类 重载函数 都使用 virtual 关键字修饰 , 表示多态 , 这样能在开发者阅读代码时...: int x; }; // 子类 class Child : public Parent { public: // 在子类构造函数初始化列表 调用 构造函数 Child(int a, int

12420

【C++】多态

注意⚠: 在重写基函数时,派生函数不加virtual关键字,也可以构成重写(可以认为继承后基函数被继承下来了在派生依旧保持虚函数属性),但是该种写法不是很规范,建议这样使用 但是...如果子类自己成员存在资源管理,那只调析构的话,就只清理了子类里面部分,那是不是就内存泄漏了啊。 那这里为什么是这样结果呢? 大家回忆一下delete会做哪些事情?...但是在这个地方,我们期望它是这样正常只调析构吗? 是不是不期望啊,因为如果指针指向子类对象,在delete时候还是只调析构,那是不是就可能会有内存泄漏风险啊。...我们期望他怎么做,按照什么去调析构? 是不是期望它按照指向对象类型去调啊。 指向对象,就按析构去走;指向子类对象,就按子类析构去走。 那我们可以怎么做?...另外上面说返回派生指针或引用也可以是其它继承体系和派生,什么意思呢? 那就是这样 这样也是可以 不过这个协变可能在实际应用场景不多。 3.

9010

Python面试8个必考问题

此答案关键是,在Python变量在内部是以字典形式进行传递。 如果一个变量名没有在当前字典中发现。 则在更高级(如它尽心搜索直到引用变量名被找到。...(如果引用变量名在自身和更高级没有找到,将会引发一个属性错误。) 因此,在设定x = 1,让变量x(带有值1)能够在其和其子类中被引用到。...这就是为什么第一个打印语句输出结果是1 1 1 因此,如果它任何一个子类被覆写了值(例如说,当我们执行语句Child.x = 2),这个值只在子类中进行了修改。...这就是为什么第二个打印语句输出结果是1 2 1 最终,如果这个值在中进行了修改,(例如说,当我们执行语句Parent.x = 3),这个改变将会影响那些还没有覆写子类值(在这个例子中就是Child2...给定以下字典子类: 8、下面的代码能够运行么?为什么? 能够运行。 当key缺失时,执行DefaultDict, 字典实例将自动实例化这个数列。

861100

【C++】继承

我们说引用其实就是起别名嘛,那这里rp就可以认为是子类对象s属于Person那一部分别名。...派生默认成员函数 在之前和对象学习,我们学过里面有6个默认成员函数 即我们写,编译器可以自动生成,那在派生,这6个默认成员函数是如何生成呢?...那如果我们写了构造,但不去处理从父继承下来成员呢? 我们手动去调,在初始化列表还是会自动去调默认构造。 那如果没有默认构造呢?...如果基没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用。 那其实这里感觉就有点像子类里面有一个自定义类型成员一样。...当然有的地方可能还是有差异,比如自定义类型成员如果没有默认构造,必须在初始列列表初始化(C++11之后可以给缺省值),但是没有默认构造的话,就只能在初始化列表显示调构造。

10110

JAVA 1-6章测试题

2>Super:如果没有提供无参数构造方法,那么,我们必须通过super语句指导子类调用其他构造方法; 3>当子类局部变量或成员变量与成员变量同名时,通过super访问成员变量...答:1>都要求方法名相同,都可以用于抽象方法和非抽象方法之间 2>重写要求参数列表必须一致,而重载要求参数列表必须不一致 3>重写要求返回类型必须一致,而重载对此不做限制 4>重写只能用于子类重写方法...答:1>方法重写只存在于子类(包括直接和间接)之间,在同一个方法只能被重载,不能被重写。...2>子类方法必须和方法具有相同方法名、参数列表和返回值 3>子类可以定义与方法同名方法,以便在子类隐藏方法 4>方法不能被子类重写成实例方法,而实例方法也不能被子类隐藏为方法...5>private、final修饰方法不能被重写;子类方法不能缩小访问权限;子类方法不能抛出比方法更多异常。

83030

第七章 面向对象编程(进阶)

因为 static 方法是属于子类无法覆盖方法。 ‍ 3.2 为什么需要方法重写? ‍ 子类在继承以后,就获取了声明所有的方法。...,this 代表本类对象引用,super 代表内存空间标识 4.1 为什么需要 super? ‍...:表示当前对象某个成员方法,该成员方法在声明 super()或 super(实参列表):调用构造器协助当前对象实例化,只能在构造器首行,只会找直接对应构造器,找不到就报错 ‍ 5...5.1 多态形式和体现 ‍ 5.1.1 对象多态性: ‍ 多态性,是面向对象中最重要概念,在 Java 体现:**对象多态性:引用指向子类对象** 格式:(类型:指子类继承类型...若编译时类型和运行时类型不一致,就出现了对象多态性(Polymorphism) 多态情况下,“看左边”:看引用不具备子类特有的方法) ** “看右边”:看子类对象(实际运行子类重写方法

12710

Java学习历程之----提升篇(五)

若随机变量X服从一个数学期望为μ、方差为σ^2正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布期望值μ决定了其位置,其标准差σ决定了分布幅度。...一、多态 多态性是指在定义属性和方法被子类继承之后,可以具有不同数据类型或表现出不同行为,这使得同一个属性或方法在及其各个子类具有不同含义。...2.重写:子类某些方法进行重新定义,在调用这些方法时就会调用子类方法。...3.向上转型:在多态需要将子类引用赋给对象,只有这样该引用才既能可以调用方法,又能调用子类方法。那下面我们通过一个具体例子来看看如何实现Java多态性吧。...方法重写:创建一个Animals,定义behavior()方法,并在子类pig进行对behavior()方法进行重写。(即方法重写子类方法与相同名称,返回类型和参数列表)。

25410

电话面试题总结,Python基础部分

C3算法 经典没有MRO和instance.mro()调用 (1)子类初始化时候,用传统调用直接用调用__init__() (2)新式(就是继承object),子类初始化时候...(3)除了直接用调用__init__(),还可以用super这个关键字 子类名称和名称相同 重写 7.方法和静态方法 静态方法是函数,不需要实例。...如果一个变量名字没有在当前字典中发现,将搜索祖先(比如)直到被引用变量名被找到. 首先,在设置 x = 1 会使得变量 x 在引用该类和其任何子类值为 1。...这就是为什么第二个 print 语句输出是 1 2 1 最后,如果该值在中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响 到任何未重写该值子类当中值(在这个示例中被影响子类是...随后当 extendList 没有被指定列表参数调用时候,其使用是同一个列表。这就是为什么函数被定义时候,表达式是用默认参数被计算,而不是它被调用时候。

94820

EasyC++78,动态联编

指针和引用类型兼容性 在C++当中,动态联编与指针和引用调用方法相关,这是由继承控制。前文当中说过,公有继承建立is-a关系,使得我们可以用指针或引用指向子类对象。...因为派生继承了基当中所有的数据成员和成员函数,因此基成员能够进行操作都适用于子类成员,所以向上强制转换是可传递。 如果反过来呢?将对象传递给子类指针呢?...,它当中除了声明内容之外,还会额外多一个指针,指向一个列表,比如是[1024,1222]。...同样Hero子类当中也会有这样一个指针指向一个虚函数列表,由于我们在Hero子类当中没有重载show_name方法,所以Hero类型对象列表第一个元素仍然是1024。...简单来说,当我们调用虚函数时候, 编译器会先通过每个对象函数列表指针拿到虚函数列表。然后在找到对应位置函数代码块地址,最后进行执行。

23310

Python 面试必考问题

为什么在改变 parent.x 同时也改变了 child2.x 值?但与此同时没有改变 Child1.x 值? 此答案关键是,在 Python 变量在内部是以字典形式进行传递。...如果一个变量名没有在当前字典中发现,则在更高级(如它尽心搜索直到引用变量名被找到。(如果引用变量名在自身和更高级没有找到,将会引发一个属性错误。)...因此,在设定 x = 1,让变量 x (带有值 1)能够在其和其子类中被引用到。这就是为什么第一个打印语句输出结果是 1 1 1。...因此,如果它任何一个子类被覆写了值(例如说,当我们执行语句 Child.x = 2),这个值只在子类中进行了修改。这就是为什么第二个打印语句输出结果是 1 2 1。...最终,如果这个值在中进行了修改,(例如说,当我们执行语句 Parent.x = 3),这个改变将会影响那些还没有覆写子类值(在这个例子中就是 Child2)这就是为什么第三打印语句输出结果是 3

56830

Python 面试8个必考问题

为什么在改变parent.x 同时也改变了 child2.x 值?但与此同时没有改变 Child1.x 值? 此答案关键是,在 Python 变量在内部是以字典形式进行传递。...如果一个变量名没有在当前字典中发现,则在更高级(如它尽心搜索直到引用变量名被找到。(如果引用变量名在自身和更高级没有找到,将会引发一个属性错误。)...因此,在设定 x = 1,让变量 x (带有值1)能够在其和其子类中被引用到。这就是为什么第一个打印语句输出结果是1 1 1。...因此,如果它任何一个子类被覆写了值(例如说,当我们执行语句 Child.x = 2),这个值只在子类中进行了修改。这就是为什么第二个打印语句输出结果是1 2 1。...最终,如果这个值在中进行了修改,(例如说,当我们执行语句 Parent.x = 3),这个改变将会影响那些还没有覆写子类值(在这个例子中就是 Child2)这就是为什么第三打印语句输出结果是3 2

86590

面向对象三大特征——封装,继承,多态

{ ....... } 注意点: java只有单继承,没有多继承 所有统一拥有一个—Object 继承只是一种关系,除此之外还有依赖,组合,聚合等关系 子类继承public和...,先调用构造器,在调用子类构造器 super必须出现在子类方法或构造方法(系统自动) 当super调用构造方法,必须在子类构造方法第一个 当包含无参构造方法时,必须在子类构造方法第一个写入...子类方法和方法结构一致 子类方法和方法方法体不一样 重写条件: 需要有继承关系,子类重写方法 方法名必须一样 参数列表必须一样 修饰符范围可以扩大但不能缩小: public>protected...>default>private 抛出异常范围可以缩小不能扩大 为什么要重写方法: 功能,子类不一定需要 功能,子类不一定满足 方法重写static和非static区别: static:...,但可以指向引用模型是不确定: 多态存在条件: 有继承关系 子类重写方法 引用指向子类对象 注意: 多态只是方法多态 定义变量 可以指向 子类模型 name = new 子类

46030

三大特性之多态

多态构成必须要满足两个条件: 1.必须要通过引用或者指针作为形参来调用 为什么一定要是引用或者指针,对于这个问题《深度探索C++模型》这样说:“一个pointer或一个reference...返回值类型,函数名称,参数列表相同),那么就称该子类函数重写了函数。...重写两个例外 1.协变 子类对于函数重写,返回类型可以不同,但必须要是返回父子类关系指针或引用(即基函数返回基对象指针或者引用,派生函数返回派生对象指针或者引用),称为协变 class...如果定义了一个子类对象,并将该子类对象赋值给一个指针,当我释放时候只会调用析构函数,也就是说只释放了子类那一部分资源,而没有释放子类资源,这就可能会导致内存泄漏。...如果将析构函数定义为虚函数并重写,那么在释放指针时候,调用子类析构函数子类析构函数对于那一部分资源通过析构函数清理,同时也会清理自己资源。

16320

Python面试8个必考问题

则在更高级(如它尽心搜索直到引用变量名被找到。(如果引用变量名在自身和更高级没有找到,将会引发一个属性错误。)...因此,在设定x = 1,让变量x(带有值1)能够在其和其子类中被引用到。...这就是为什么第一个打印语句输出结果是1 1 1 因此,如果它任何一个子类被覆写了值(例如说,当我们执行语句Child1.x = 2),这个值只在子类中进行了修改。...这就是为什么第二个打印语句输出结果是1 2 1 最终,如果这个值在中进行了修改,(例如说,当我们执行语句Parent.x = 3),这个改变将会影响那些还没有覆写子类值(在这个例子中就是Child2...8、给定以下字典子类,下面的代码能够运行么?为什么

46520

《Effective C++》读书摘要

七、多态基声明虚析构函数)具有多态性质基)需要虚析构函数; 八、不让异常逃出析构 异常时终止或者吞下; 将可能抛出异常代码提供给用户管理; 九、不在构造和析构调用虚函数 调用后仅仅是自身函数...,而非子类; 需要子类构造信息解决方案:子类使用静态函数构造基参数。...三十五、考虑虚函数以外选择 私有虚函数被调用时候自动多态,基本保留何时调用权力,子类拥有修改功能权力; ? function函数指针对象使得函数指针更加灵活; 古典策略模式: ?...三十九、审慎使用private继承 私有继承表达是实现关系,子类使用提供接口,但是继承; 能用复合不用私有继承; 如何实现final字段: ?...四十二、typename双重含义 模板声明与class没有任何区别; 嵌套从属类型显式指定,不能出现在基列表和初始化列表; ?

1.9K60
领券