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

添加字符串类型的类成员会导致调用基类函数而不是子类

这个问题涉及到面向对象编程中的继承和多态的概念。

当在子类中添加一个与父类同名的类成员时,如果调用了父类中的函数,而不是子类中的函数,可能是因为子类没有正确地重写父类的函数。

在面向对象的编程中,继承是一种机制,它允许子类继承父类的属性和方法。当子类继承一个父类时,它可以通过重写父类的方法来自定义自己的行为。重写就是在子类中实现与父类中同名的方法,以覆盖父类的实现。

要解决这个问题,可以确保子类中正确地重写了父类的方法。重写一个方法需要保证方法的签名(包括方法名、参数列表和返回类型)与父类中的方法相同。同时,可以使用关键字override来明确表示重写了父类的方法。

以下是一个示例,展示了一个父类和子类的继承关系以及正确重写父类方法的示例代码:

代码语言:txt
复制
class ParentClass:
    def print_message(self):
        print("This is the parent class")

class ChildClass(ParentClass):
    def print_message(self):
        print("This is the child class")

child = ChildClass()
child.print_message()

在上面的示例中,子类ChildClass继承了父类ParentClassprint_message方法,并在子类中重写了该方法。当调用子类的print_message方法时,输出结果将是"This is the child class"。

通过正确地重写父类的方法,我们可以确保调用子类中的方法而不是父类中的方法。

请注意,这里没有提及任何特定的云计算品牌商或产品,因为这是一般性的编程概念,适用于任何面向对象编程语言和云计算环境。

希望这个答案能帮到你!如果你有任何其他问题,请随时提问。

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

相关·内容

《Effective C++》学习笔记

构造函数使用成员初始化列表来赋值,不是在构造函数里去赋值(导致赋值两次,浪费了),列表排列次序保持和class中声明次序一致。...对于一些可能在被别的直接调用成员函数、值,最好改为暴露一个返回其对象引用函数形式,不是暴露其对象本身,这可以保证在函数内完成初始化,避免被调用时还没有初始化。...或者继承一个类似uncopyable,该相应函数为private且不予实现,这样子类调用时会去调用函数,从而被编译器拒绝。...,即使不是,也可能不符合你想要目的(是父结果不是子类结果)。...如果一定要用,试着考虑无需转型替代设计,例如为添加一个什么也不做衍生使用函数,避免在使用时需要将指针转型为子类指针。

1.1K20

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

在切片过程中,派生对象部分(通常是额外添加成员变量和方法)会被忽略,只有中定义部分会被复制到对象中。...实际上,在行 Person& rp = sobj; 中,引用 rp 的确是 Person 类型,但它并不导致对象切片。引用实际上并不拥有它所引用对象,只是提供另一个名称来访问现有对象。...在 Student 中,成员函数 Print 试图访问名称为 _num 成员变量。由于派生中存在同名成员,派生 _num 隐藏同名成员。...C++ 规则规定,如果派生提供了和类同名函数中同名函数在派生作用域就不再可见了 因此,在 B 成员函数 fun(int) 中,调用 fun() 试图无参数调用被隐藏同名函数无法编译...,因为编译器认为我们试图调用 fun(int) 这个版本,但没有提供参数,导致参数不匹配 修复 为了调用 A fun 函数,我们必须显式地使用作用域解析运算符 :: 来指明我们想要调用函数属于作用域

32710
  • 01 - JavaSE之基础及面向对象

    JAVA 浮点数默认类型是 double。 将一个 float 类型数,强制转换成 long 类型舍去小数部分,不是四舍五入。...静态成员函数不能调用非静态成员成员变量和非静态成员函数,因为静态成员函数不需要new一个对象出来(使用static声明方法为静态方法,在调用该方法时候,不会将对象引用传递给它,所以在static...继承中构造方法 子类构造过程中必须调用构造方法(先父母,后客人,最后自己) 子类可以在自己构造方法中使用 super 调用构造方法(使用 this调用本类另外构造方法) 如果子类构造方法没有显式调用构造方法...如果子类构造方法中既没有显式调用构造方法,中又没有无参数构造方法,则编译出错。 ---- Object 之 toString 方法 Object是所有 java 根基。...---- 对象转型 一个引用类型变量可以指向其子类对象。 一个引用不可以访问其子类对象新增加成员(属性和方法)。

    55840

    CC++面试题之语言基础篇(一)

    需要手动将其转换为适当类型 new 会调用构造函数来初始化对象(如果是自定义对象), malloc 不会执行构造函数。 void * void * 是通用指针类型,被称为"无类型指针"。...内联函数本质上是一个函数,比如有返回值、参数列表等 宏函数是在预编译期做简单字符串替换 ;内联函数则是在编译期进行代码插入 宏定义是没有类型检查,无论对还是错都是直接替换;内联函数在编译时候进行类型检查...strcpy 是标准C库函数,用于将一个字符串复制到另一个字符串中。然而它不检查源字符串长度,可能导致缓冲区溢出,引发安全漏洞。...结构体比较,怎么判断两个对象是否相等 需要逐个比较它们成员变量(字段) 继承关系中子类能访问父哪些成员变量以及成员函数 在继承关系中,子类(派生)通常可以访问父以下成员变量和成员函数...构造函数和析构函数:如果构造函数和析构函数是公有的,子类可以直接访问它们;如果构造函数和析构函数是受保护或私有的,子类仍然可以访问它们,但只能在子类构造函数和析构函数内部调用它们,不能在外部使用

    22510

    【C++】继承

    到现在为止,我们已经学过很多域了,比如局部域、全局域、域、命名空间域等等,派生作用域当然也是不同,如果继承中子类有名字相同成员函数或变量,则子类屏蔽父这些同名成员,如果调用则优先调用子类同名成员...复制重载和拷贝构造有一点不一样,由于复制重载函数名在子类函数名相同,所以在调用复制重载时必须指定域,否则会导致死循环调用子类复制重载,最终导致堆栈溢出。...派生对象初始化时,先调用构造再调用子类构造,在析构时与栈结构相同,先调用子类析构函数,在子类析构函数调用完毕时,编译器自动调用析构函数。...最后归纳一下,将派生分为三部分,内置类型,自定义类型成员成员统一调用成员函数进行处理,除析构不需要显式调用外,其他都需要显示调用。...把子类分为三个部分,内置类型,自定义类型,父那一部分,父那一部分规定死只能调用成员函数

    69410

    【C++】继承(上)

    设置为protected后,子类继承可以使用 ---- 调用函数去访问 虽然成员变量是由private修饰,只是派生中不可以用,但是子类student 可以调用函数去访问...继承中作用域 1.在继承体系中和派生都有独立作用域 2.子类和父有同名成员子类成员将屏蔽父对同名成员直接访问,这种情况也叫隐藏,或者重定义 (在子类成员函数中,可以使用 ::成员...,但是调用子类对象时会自动调用中构造函数和析构函数 构造函数成员必须调用构造函数初始化 name属于父成员,所以要去调用构造函数初始化 ---- 如果不写,会在初始化列表去调用默认构造函数...---- 析构函数不要显示调用,因为自动调用 构造时,先构造父,在构造子类,所以析构时,要先析构子类,在析构父 自己实现不能保证先析构子类,在析构父 所以在子类析构函数完成时,自动调用析构函数...友元关系不能被继承 有一个函数,是你父友元,不是子类友元 ---- Display作为父友元函数,可以访问父成员变量,但是不能访问子类成员变量 7.

    27310

    TypeScript 官方手册翻译计划【十二】:

    TypeScript 不会分析在构造器中调用方法以检测初始化语句,因为派生可能重写这些方法,导致初始化成员失败。...: any) { // TBD } } 构造器签名和函数签名只有一点区别: 构造器不能使用类型参数 —— 类型参数属于声明部分,稍后我们进行学习 构造器不能给返回值添加类型注解 —...在这个例子中,由于我们通过 obj 引用去调用函数,所以它 this 值是 obj,不是实例。 这通常不是我们期望结果!...,即使对于那些没有使用 TypeScript 进行检查代码也是如此 这样会占用更多内存,因为以这种方式定义函数导致每个实例都有一份函数副本 你无法在派生中使用 super.getName,因为在原型链上没有入口可以去获取方法...这种方法利弊权衡和上面使用箭头函数方法相反: JavaScript 调用方可能仍然会在没有意识情况下错误地调用方法 只会给每个定义分配一个函数不是给每个实例分配一个函数 仍然可以通过

    2.6K10

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    函数是允许被其子类重新定义成员函数。 可以实现用父类型别的指针指向其子类实例,然后通过父指针调用实际子类成员函数。...宏定义在预处理时候进行简单字符串替换,内联函数在编译时在每个调用内联函数地方将函数展开,这样不用使内联函数占用栈空间,提高效率。...宏定义没有类型检查,但是内联函数还是具有函数性质,有参数以及返回值。 26、struct与union区别? struct可以存储多个成员变量信息;union每个成员共用同一个存储空间。...由于多态性,指针可以指向派生对象,如果删除该指针,就会调用该指针指向派生析构函数派生析构函数又自动调用析构函数,这样整个派生对象完全被释放。...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指针时,只会调用析构函数调用派生析构函数,这样就会造成派生对象析构不完全,造成内存泄漏。

    2K20

    《逆袭进大厂》第三弹之C++提高篇79问79答

    函数指针指向是特殊数据类型函数类型是由其返回数据类型和其参数列表共同决定函数名称则不是类型一部分。...3、 如果在析构函数调用delete this,会发生什么? 导致堆栈溢出。原因很简单,delete本质是“为将被释放内存调用一个或多个析构函数,然后,释放内存”。...拷贝构造函数用来初始化一个非引用类型对象,如果用传值方式进行传参数,那么构造实参需要调用拷贝构造函数拷贝构造函数需要传递实参,所以一直递归。 149、你知道空大小是多少吗?...1) 当初始化一个引用成员变量时; 2) 初始化一个const成员变量时; 3) 当调用一个构造函数构造函数拥有一组参数时; 4) 当调用一个成员构造函数,而他拥有一组参数; 5)...虚函数是为了实现动态编联产生,目的是通过类型指针指向不同对象时,自动调用相应、和类同名函数(使用同一种调用形式,既能调用派生又能调用同名函数)。

    2.2K30

    C++基础知识

    中,静态成员可以实现多个对象之间数据共享,并且使用静态数据成员还不会破坏隐藏原则,即保证了安全性。因此,静态成员所有对象中共享成员不是某个对象成员。...例如:一个父类型指针指向一个子类对象时候,使用父指针去调用子类中重写了函数时候,会调用子类重写过后函数,在父中声明为加了 virtual 关键字函数,在子类中重写时候不需要加...虚函数作用 当一个子类继承了一个含有虚函数,并重写了该一个虚函数,我们就说这两个构成多态。...子类继承同时,函数表也被子类继承,不同是被子类重写函数将会替代原来虚函数表中对应函数地址。...从而子类调用同名函数时,所调用不是同一个函数,从而体现了多态和虚函数作用。

    1.4K32

    Google C++ 编程风格指南(三):

    如果在构造函数调用了自身函数, 这类调用是不会重定向到子类函数实现. 即使当前没有子类化实现, 将来仍是隐患....若未声明构造函数, 则编译器会生成一个默认构造函数, 这有可能导致某些成员未被初始化或被初始化为不恰当值. 定义: new 一个不带参数对象时, 会调用这个默认构造函数....缺点: 许多类型都不需要拷贝, 为它们提供拷贝操作让人迷惑, 也显得荒谬不合理. 为提供拷贝 / 赋值操作是有害, 因为在使用它们时会造成对象切割....定义: 当子类继承时, 子类包含了父所有数据及操作定义....子类不能重写父非虚函数, 当然也就不能修改其实现. 也可能定义了一些数据成员, 还要区分实际布局. 结论: 所有继承必须是 public .

    80540

    【c++】继承学习(二):探索 C++ 中派生默认机制与静态成员共享

    ,对内置类型不做处理,对自定义类型调用默认构造函数,规则和以前一样 派生里面,把父成员当做一个整体 派生构造函数必须调用构造函数初始化那一部分成员。...,父调用构造函数初始化 成员变量初始化顺序是根据它们在定义中出现顺序,不是初始化列表中顺序。...() { Person::~Person(); cout << "~Student()" << endl; } 但是这里导致一个问题,析构多调用了一次,就是因为析构函数调用子类调用子类析构函数结束后会自动调用析构...,不是单个实例相关联。...因此,第二次打印 _count 结果是 0 静态成员继承性质:静态成员及其派生之间是共享不是每个派生都有独立静态成员副本。

    11310

    C++中继承

    即假如有父fun()函数子类fun(int a)函数,fun函数不是构成重载,因为不在同一个域中,而是构成隐藏!...,编译器变我们自动生成一个,那么在派生 中,这几个成员函数是如何生成呢?...如下图中,构造函数不是默认,因此需要派生中写出构造函数,并且在初始化列表中去调用构造函数。 ⭐2.派生拷贝构造函数必须调用拷贝构造完成拷贝初始化。...(三部分:内置类型,自定义类型类型),此时如果需要深拷贝是父类型,那就是去调用类型,如果是自定义类型就是去调用子类自己拷贝构造。...其实很好想,什么样类型就去调用什么样拷贝构造,仅此而已。 那么如何去显示调用拷贝构造呢?在显示调用时候,是需要传入父对象,但是我们前面说了,子类对象可以进行切片,赋值给父

    97330

    C++编程经验(4):不要在构造函数和析构函数中使用虚函数

    ---- 构造函数调用函数 首先构造函数中不能调用函数不是说语法不允许,最重要原因在于,当有继承时候,父调用子类函数,但是此时子类并没有初始化,导致数据错误,就这一点足已让你不能在构造函数调用函数...在构造过程中,虚函数调用从不会被传递到派生中。代之是,派生对象表现出来行为好象其本身就是类型。不规范地说,在构造过程中,虚函数并没有被"构造"。...简单说就是,在子类对象子对象构造期间,调用函数版本是不是子类。...如果在构造过程中对虚函数调用传递到了派生, 派生对象当然可以参照引用局部数据成员,但是这些数据成员其时尚未被初始化。这将会导致无休止未定义行为和彻夜代码调试。...,新版编译器拒绝你在构造函数调用了虚函数,然后帮你调整了方向。。。

    1.3K30

    C++基础知识复习

    所有成员函数以及数据成员都会被子类继承 先调用构造函数,再调用子类构造函数。 ---- 先调用构造函数用来初始化从父继承来数据。...(例如:初始值列表) 没有显示调用构造函数,那么自动调用默认构造函数。...子类.父::方法(); 或者子类重新定义这个方法,在里面使用名进行限定来调用对应方法。 ---- 一个有两个子类, 这两个子类又是一个子类。 容易产生二义性。...如果这个指针指向子类对象,那么调用子类析构函数,再调用析构函数。 如果指向是父对象,那么只调用析构函数。...注意: 为了防止内存泄露,最好在虚构函数添加virtual关键字,使析构函数为虚函数。 纯虚函数与抽象 什么时候使用纯虚函数

    54510

    面向对象编程基础2(干货)

    3.虚方法和多态:面向对象编程中,都遵循一个原则,依赖导致原则。换句话说就是,程序要依赖于抽象(pet),不是依赖于具体(Dog)如上图。...多态--通过指向派生(统一)调用调用函数根据引用所指向派生实际类型调用派生同名重写函数,即为多态(个性张扬)。...7.接口:接口是指定一组函数成员不实现他们引用类型。关键字interface。 特点:比抽象更抽象,有点像完全没有普通函数和数据抽象。...结构不能定义默认构造函数,编译器定义。...扩展方法:如果有源代码,直接添加一个新方法。 如果不能修改但是也不是密闭,可以派生子类扩展。

    1.1K20

    C++ 使用规范建议

    (2)操作失败造成对象初始化失败,引起不确定状态。 (3)构造函数调用函数调用不会派发到子类实现中,即使当前没有子类实现,将来仍是隐患。...,构造函数Foo::Foo(string name)被调用并将该字符串转换为一个Foo临时对象传给调用函数。...struct被用在仅包含数据消极对象(passiveobjects)上,可能包括有关联常量,但没有存取数据成员之外函数功能,存取功能通过直接访问实现而无需方法调用,这儿提到方法是指只用于处理数据成员...定义:当子类继承时,子类包含了父所有数据及操作定义。...(3)如果有虚函数函数,那么令析构函数为virtual。原因是保证通过指针能够动态调用子类析构函数,避免内存泄露。

    1.8K20

    【C++ 进阶】继承

    ,这个过程又被形象称为      切片/切割; 2.对象不能赋值给派生对象; 3.指针或者引用可以通过强制类型转换赋值给派生指针或者引用。...但是必须是指针是指向派生对象时才是安全; 四.隐藏(重定义) 1.子类和父中,只要函数名相同就构成隐藏; 2.成员名相同也构成隐藏; 3.在子类成员函数中,可以使用 ::成员...五.派生默认成员函数 1.构造函数  派生必须先自动调用默认构造(初始化那一部分成员),如果没有默     认构造,就要在派生初始化列表阶段显式调用构造函数,然后派生调用自己...4.析构函数    销毁对象时,调用派生析构函数,然后再自动调用析构函数,这样就保证     了析构顺序(即先子后父);    如果不是这个顺序,一个成员可能析构两次,就会导致程序崩溃...无论派生出多少个子 ,都只有一个static成员实例 ,静态成员不属于任何一个具体实例对象,而是属于本身,子类可以继承父静态成员不需要重新定义。

    13110

    从零开始学C++之继承(一):公有私有保护继承、overloadoverwriteoverride之间区别

    (has-a) 如果希望新与已存在有相同接口(在这基础上可以增加自己成员)。这时候需要用继承,也称为子类型化。...首先想到是在C++ 中,子类构造函数自动调用构造函数。同样,子类析构函数自动调用析构函数。要想一个不能被继承,我们只要把它构造函数和析构函数都定义为私有函数。...那么当一个试图从它那继承时候,必然会由于试图调用构造函数、析构函数导致编译错误。 可是这个构造函数和析构函数都是私有函数了,我们怎样才能得到该类实例呢?...虚继承过来,在调用Try构造函数时候,直接跳过FinalClass2直接调用MakeFinal构造函数。...调用try构造函数时,调用它包含所有virtual base构造函数,然后再调用它上层base构造函数,然后是设置vptr,最后是初始化列表和子类构造函数体内用户代码。

    93900

    TS 进阶 - 类型基础

    # void 类型 在 TypeScript 中,一个没有返回值(即没有调用 return 语句)函数,其返回值类型应该被标记为 void 不是 undefined,尽管它实际值就是 undefined...拥有多个重载声明函数在被调用时,是按照重载声明顺序往下查找。 TypeScript 中重载更像伪重载,只有一个具体实现,其重载体现在方法调用签名上不是具体实现细节上。...静态成员不会被实例继承,始终属于当前定义这个(及其子类)。原型对象上实例成员沿着原型链进行传递,能被继承。...派生可以访问使用 public 或 protected 修饰符成员。除了访问外,派生可以覆盖方法,但仍然可以通过 super 来调用方法。...any 类型万能性导致其被经常滥用,需要注意: 如果是类型不兼容报错导致要使用 any,考虑使用类型断言代替 如果是类型太复杂导致不想全部声明要使用 any, 考虑去将这里类型去断言为需要最简类型

    1.8K50
    领券