首页
学习
活动
专区
工具
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"。

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

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

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

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

相关·内容

十、继承

如果基类中的函数不是虚函数,派生类中的同名函数将隐藏基类中的函数,而不是重写它。...这是因为基类指针或引用只能访问基类定义的接口,而派生类可能添加了额外的成员。 基类指针/引用指向派生类对象:这是多态性的基础。通过基类指针或引用,我们可以调用派生类重写的虚函数,实现运行时多态。...隐藏(Hiding):如果子类中的函数与父类中的函数同名,但参数列表不同(或者函数不是虚函数),那么子类中的函数会隐藏父类中的同名函数。...这种情况下,通过基类指针或引用来调用该函数时,不会调用到子类中的版本,除非使用子类类型的指针或引用来调用。...当静态成员被定义在基类中时,这些成员也会被子类继承,但它们仍然是属于基类的,而不是子类的一个独立拷贝。 静态变量:所有派生类的对象共享基类中定义的静态变量。

7710

《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 函数,我们必须显式地使用作用域解析运算符 :: 来指明我们想要调用的函数属于基类作用域

    37910

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

    具体来说,子类会继承基类的成员变量和成员函数,并且可以添加新的成员或修改已有的成员。子类通过继承关系,可以拥有基类的公共和受保护(protected)成员。...如果基类的show()是虚函数(virtual),那么即使派生类定义了同名的show(),也会根据实际对象类型进行动态调用,而不会发生隐藏。...这是虚函数和多态的行为。 如果基类函数不是虚函数,调用会被静态绑定到基类函数上,而不会调用派生类函数。...,使用基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能会导致内存泄漏或资源未正确释放。...,可能只会调用基类的析构函数,而不会调用派生类的析构函数,导致资源泄漏。

    17110

    01 - JavaSE之基础及面向对象

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

    57040

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

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

    30910

    封装、继承与多态究极详解(面试必问)

    内存布局: 对象的内存布局包含了父类部分和子类部分。父类的成员变量和成员函数会先存储在内存中,子类会在父类的基础上添加额外的成员。...扩展性:子类可以继承父类的功能,并在此基础上扩展或重写,满足更多需求。 缺点: 紧密耦合:继承会导致类之间的紧密耦合,子类对父类的依赖较强,修改父类可能影响子类的行为。...虚函数是基类中声明为 virtual 的函数,子类可以重写这个函数。当通过基类指针或引用调用该函数时,程序会根据对象的实际类型(而不是指针或引用的类型)来决定调用哪个函数实现。 2.1....多态的实现方式 父类指针或引用指向子类对象:当父类指针或引用指向子类对象时,调用虚函数会动态绑定到子类的实现上,而不是父类的实现。这样就实现了多态。...每个包含虚函数的类,在编译时会生成一个虚函数表,其中存储着类的所有虚函数指针。当通过父类指针调用虚函数时,程序会查找虚函数表,找到对应的子类实现并调用。

    12410

    【C++】继承

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

    71010

    【C++】继承(上)

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

    28210

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

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

    2.6K10

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

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

    2.2K20

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

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

    2.2K30

    C++基础知识

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

    1.4K32

    十一、多态

    即,需要使用基类类型的指针或引用来指向子类对象,并通过该指针或引用来调用虚函数。 原理:在运行时,程序会根据指针或引用所指向对象的实际类型,在虚函数表中查找并调用相应的函数版本。...,如果子类写了个和父类函数原型一样的函数,并且父类中的函数没有声明为虚函数,则子类会直接覆盖掉父类的函数 通过父类指针或引用执行子类对象时,会调用父类的函数 虚函数重写 必须发生于父类和子类之间...通过在基类中将函数声明为virtual,我们可以实现多态,即使用基类类型的指针或引用来调用派生类中的成员函数。...当通过基类指针删除派生类对象时,如果基类的析构函数不是虚的,那么只会调用基类的析构函数,而不会调用派生类的析构函数。...通过基类类型的指针或引用来调用虚函数时,会根据实际的对象类型来调用相应的函数。 抽象类:定义一个只包含纯虚函数的类作为抽象基类,派生类必须实现这些纯虚函数才能被实例化。

    10110

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

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

    83040

    C++中的继承

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

    1K30

    C++基础知识复习

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

    56310

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

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

    13010

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

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

    1.7K30

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

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

    1.1K20
    领券