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

为什么派生类不能用从原始类型派生的类型重写基类中的属性?

派生类不能用从原始类型派生的类型重写基类中的属性,是因为属性的类型是在基类中定义的,派生类只能继承基类的属性,而不能修改属性的类型。

当一个类从另一个类派生时,它继承了基类的属性和方法。属性是类中的变量,用于存储对象的状态。在基类中定义的属性具有特定的类型,这个类型在派生类中是不能改变的。

如果派生类试图用从原始类型派生的类型重写基类中的属性,会导致类型不匹配的错误。这是因为派生类的属性类型必须与基类中定义的属性类型相同或兼容。

例如,假设有一个基类Animal,其中有一个属性name的类型是字符串。如果派生类Dog试图用整数类型重写基类Animal中的属性name,就会导致类型不匹配的错误。

派生类可以通过继承基类的属性,并在派生类中添加新的属性来扩展基类的功能。如果需要修改基类属性的类型,可以在派生类中重新定义一个新的属性,然后在派生类中使用这个新属性。

总结起来,派生类不能用从原始类型派生的类型重写基类中的属性,是因为属性的类型是在基类中定义的,派生类只能继承基类的属性,而不能修改属性的类型。

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

相关·内容

abstract virtaul override new 及多态

在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。...将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。 默认情况下,方法是非虚拟的。不能重写非虚方法。...通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。 派生类 在 C# 中,派生类可以包含与基类方法同名的方法。 基类方法必须定义为 virtual。...new 关键字放置在要替换的类成员的返回类型之前 使用新成员隐藏基类成员(其实就是new与override的区别,从文字上来说一个是隐藏一个是重写) 如果希望派生成员具有与基类中的成员相同的名称,...从派生类访问基类虚拟成员 已替换或重写某个方法或属性的派生类仍然可以使用基关键字访问基类的该方法或属性。

78630

C#中Abstract 、Virtual和Override的使用

4) 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。 5) 在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。...除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用abstract修饰符是错误的。在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。...虚拟成员的实现可由派生类中的重写成员更改。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。...4. base和this的区别 1)base作用:用于从派生类中访问基类的成员,调用基类上已被其他方法重写的方法。指定创建派生类实例时应调用的基类构造函数。...注:从静态方法中使用 base 关键字是错误的。 2)区别: base 是子类中引用父类,用于在派生类中访问重写的基类成员。

1.3K20
  • C++:44---关键字virtual、override、final

    ,其解析过程发生在编译时而非运行时 派生类可以不覆盖(重写)它继承的虚函数 重写(覆盖)的概念与规则 派生类重写(覆盖)基类中的函数,其中函数名,参数列表,返回值类型都必须一致,并且重写(覆盖)的函数是...virtual函数 虚函数在子类和父类中的访问权限可以不同 相关规则: ①如果虚函数的返回值类型是基本数据类型:返回值类型必须相同 ②如果虚函数的返回值类型是类本身的指针或引用:返回值类型可以不同,但派生类的返回值类型小于基类返回值类型...}; 二、为什么要设计虚函数 我们知道派生类会拥有基类定义的函数,但是对于某些函数,我们希望派生类各自定义适合于自己版本的函数,于是基类就将此函数定义为虚函数,让派生类各自实现自己功能版本的函数(但是也可以不实现...关键字 virtual: 放在函数的返回值前面,用于表示该成员函数为虚函数 父类虚函数前必须写;子类虚函数前可以省略(不困省不省略,该函数在子类中也是虚函数类型) virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义...派生类可以改写基类虚函数的默认实参,但是不建议,因为这样就违反了默认实参的最初目的 建议:如果虚函数使用了默认实参,那么基类和派生类中定义的默认实参最好一致 class A { virtual void

    4.3K42

    【C++】———— 多态

    二、多态的定义和实现 1.多态构成条件 在继承中要形成多态还有两个条件: 调用时必须要通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须含有对基类的虚函数的重写 这里我们插入一个概念...,你传递的是父类就调用父类的函数,传递的是子类就调用子类的函数, 在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性...),但是该种写法不是很规范,不建议这样写 2.虚函数的重写和协变 上面例子中,我们实现了虚函数的重写(覆盖): 派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字...虚函数重写的两个例外: 2.1协变 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...三个概念的对比: 重载:两个函数在同一作用域,然后参数类型不同 重写(覆盖):两个函数分别在基类和派生类,返回值/参数/函数名都必须相同 重定义:两个基类和派生类的同名函数不构成重写就是重定义,函数名形同

    11510

    学习记录——抽象类和密封类

    例如: public abstract class A { // Class members here. } 抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。...抽象类的派生类必须实现所有抽象方法。 当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。...继承抽象方法的类无法访问方法的原始实现,因此在上一示例中,类 F 上的 DoWork 无法调用类 D 上的 DoWork。通过这种方式,抽象类可强制派生类向虚拟方法提供新的方法实现。...例如: public sealed class D { // Class members here. } 密封类不能用作基类。 因此,它也不能是抽象类。 密封类禁止派生。...由于密封类从不用作基类,所以有些运行时优化可以略微提高密封类成员的调用速度。 在对基类的虚成员进行重写的派生类上,方法、索引器、属性或事件可以将该成员声明为密封成员。

    37531

    解锁C++多态的魔力:灵活与高效的编码艺术(上)

    通过基类指针或引用指向派生类对象,可以在运行时调用派生类的重写方法,而不依赖于对象的静态类型。这种方式称为运行时多态或动态多态。...2.1.1 为什么需要基类指针或引用 在C++中,如果直接使用派生类对象,即使它重写了基类的虚函数,编译器仍然会使用静态绑定,即在编译时确定调用的函数版本。...,派生类的虚函数在不加 virtual 关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用。...这两个例外是: 参数默认值不参与重写 在C++中,虚函数的重写不会受到参数默认值的影响,即使在基类的虚函数中定义了默认参数值,派生类重写时也可以选择不同的默认值。...如果基类的虚函数返回非指针或非引用类型,派生类不能重写该虚函数并更改返回类型。

    15710

    C++新旅程:三大特性之多态

    为了方便使用,人们想出用一个调用形式,调用基类和派生类的同名函数,通过指针分别调用这些同名的函数。允许在派生类中重新定义和基类同名的函数,并可以通过基类指针或引用来访问积累和派生类中的同名函数。...2.2虚函数的重写(覆盖)派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。...注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因 为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用 虚函数重写的两个例外...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...(了解) 2.析构函数的重写(基类与派生类析构函数的名字不同) 如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字, 都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同

    10910

    C++中的多态

    ②派生类对基类重写的虚函数,可以不加上virtual,因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性,但一般而言最好加上去,提高代码的阅读性。 虚函数重写/覆盖的两个特殊情况 1....⭐隐藏/重定义: ①两个函数必须分别在基类和派生类当中。 ②函数名相同 ③如果基类和派生类的两个同名函数不构成重写那就是隐藏 ⭐重写/覆盖: ①两个函数必须分别在基类和派生类当中。...②如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数 ③派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后。 ④虚表是存放在代码段中的。  ...反思构成多态的条件 通过分析,我们可以好好反思一下构成多态的条件,为什么要虚函数重写,为什么要基类对象的指针或引用调用虚函数。 ①为什么虚函数覆盖/重写: 因为要对派生类的虚表进行覆盖。...在调用重写的函数的时候,如果指向的是派生类对象,那么就必须从这个派生类的虚表中拿到这个虚函数的地址。 ②为什么要基类对象的指针或引用去调用虚函数: 首先,虚函数必须写在基类中。

    84420

    【C++深度探索】全面解析多态性机制(一)

    1.什么是多态 在C++中,多态(Polymorphism)是指通过基类指针或引用来访问派生类对象的一种机制。简单来说,它允许我们在基类类型的指针或引用上调用派生类对象的成员函数。...(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,所以不建议这样使用 注意这里与继承中的隐藏区分一下,隐藏是只要在派生类中有与基类函数名相同的函数就构成,而重写则需要返回值...4.虚函数重写的两个例外 协变(基类与派生类虚函数返回值类型不同) 即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...前面我们学习过虚函数重写必须要求基类与派生类除了函数体以外其它完全相同,但是对于协变,基类与派生类的返回值类型可以不同,但基类与派生类的函数的返回类型必须是继承关系 //协变 class A {};...纯虚函数是在基类中声明的虚函数,但没有给出具体的实现,也就是没有函数体。抽象类只能用作其他类的基类,不能被直接实例化。

    12710

    探索CC++的奥秘之C++中的继承

    如果是struct默认是公有继承,类外面、类里面都可以访问。 基类的private成员在派生类都是不可见的,也就是不能用。...3.基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。...(ps:这个我们后 面再讲解,这里先了解一下) 扩展一个小知识:类型转换分为强制类型转换和隐式类型转换。 从对象的角度来说,父对象是不能给子对象的。 3.继承中的作用域 1....4.派生类的默认成员函数 6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类 中,这几个成员函数是如何生成的呢? 1....要是下面这样写: 正确的写法:  这里直接写Person(s)也可以, 因为基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。 如果不写:Person(s): 为什么不是张三呢?

    12210

    【C++】多态详细讲解

    }; 注意:在重写基类虚函数时, 派⽣类的 虚函数在 不加virtual 关键字时,也 可以构成重写 (因为继承 后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性), 但是该种写法不是很规范 ,...在继承中我们说过派生类和基类的切片/切割问题,参数类型是基类可以保证实参传基类的对象也可以,传派生类的对象也可以。如果是派生类的指针或引用,基类对象根本传不过去。...如果都是虚函数并且进行了虚函数的重写/覆盖,但是Ticket参数类型不是基类的指针或引用,依旧是不构成多态的。...A是基类,B是派生类。...A和B里有返回值、函数名、参数类型都相同的函数func,虽然在派生类B里面没有加virtual,在这里依然构成虚函数的重写(原因前面说过)。

    8310

    十、继承

    通过继承,可以定义基类的指针或引用来指向派生类的对象,并在运行时根据对象的实际类型调用相应的方法。 扩展性:派生类可以在继承基类的基础上添加新的属性和方法,从而扩展类的功能。...派生类不能定义与基类同名的静态成员(除非它们在不同的作用域内,例如通过嵌套类)。 方法重写(覆盖): 派生类可以重写基类中的虚函数(通过相同的函数签名和 virtual 关键字)。...如果基类中的函数不是虚函数,派生类中的同名函数将隐藏基类中的函数,而不是重写它。...从内存布局的角度看,派生类对象中确实包含了这些私有成员。 访问权限的变更仅影响继承后的成员的访问方式,不会改变基类中成员本身的访问权限。...重写(Overriding):当子类定义了一个与父类中具有相同签名(函数名、参数列表、返回类型、const属性、volatile属性、引用属性等)的虚函数时,子类中的这个函数会重写(Override)父类中的虚函数

    7710

    c++进阶(c++里的多态)

    ):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型,函数名字,参数列表完全相同),称子类虚函数重写了基类的虚函数。...,派生类的虚函数前可以不加virtual关键字, 虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性)但是这种写法不是很规范,不建议这样写。...1.协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回类型不同。...) 3.两个函数必须是虚函数 重定义:1.两个函数分别再基类和派生类的作用域 2.函数名相同 3.两个基类和派生类的同名函数不构成重写就是重定义 3.抽象类 3.1概念 在虚函数的后面写上 =0...b.如果派生类重写基类中某个函数,用派生类总结的虚函数覆盖虚表中基类的虚函数 c.派生类总结新增的虚函数按其在派生类中的声明次序增加到派生类虚表的最后 6.这里还有一个容易混淆的问题:虚函数存在哪?

    8310

    再探虚函数

    函数模板的使用 动态多态 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,...必须是虚函数(派生类一定要重写基类中的虚函数) ---- Q2:什么是纯虚函数,与虚函数的区别 1、定义一个函数为虚函数,不代表函数为不被实现的函数。...2、纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 3、声明了纯虚函数的类是一个抽象类。...所以,用户不能创建类的实例,只能创建它的派生类的实例,它必须在继承类中重新声明函数。 4、定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。...只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。

    87620

    【C++】多态——实现、重写、抽象类、多态原理

    (即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同。...继续往下看把 而通过指针是符合多态条件的: 注意: 1.子类虚函数可以不加virtual 在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性...),但是该种写法不是很规范,不建议这样使用: 2.协变(基类与派生类虚函数返回值类型不同) 在三同中,返回值可以换不同,但是要求返回值必须是一个父子类关系的指针或者引用 ---- 三、析构函数的重写...重定义(隐藏):两个函数分别在基类和派生类的作用域,同时,函数名相同,如果两个基类和派生类的同名函数不构成重写那就是重定义!...总结一下派生类的虚表生成:先将基类中的虚表内容拷贝一份到派生类虚表中,如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数,派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后

    55931

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

    概念1:继承 1.C#语言的继承方式为单继承。继承中的基类代表父类,继承者称为派生类。 2.隐藏方法:如果想在派生类中定义一个和基类中重名的方法,但是实现过程不一样,这中操作叫隐藏方法。...多态--通过指向派生类的基类(统一)调用,调用虚函数,会根据引用所指向派生类的实际类型,调用派生类中的同名重写函数,即为多态(个性张扬)。...比如下图,基类中的虚方法为Speak(),派生类中可以使用override关键字对Speak()方法进行重写。 ? ? ?...抽象类的抽象成员在派生类中需要使用override关键字实现。 6.密闭类和密闭方法:关键字是sealed。 密闭类就是不希望其他人通过继承来修改,密闭方法就是不希望他人重写该方法。...一般基类方法不希望被子类重写,就可以不声明为virtual。如果是派生类方法不希望子类对其重写,同时是override重写,就可以使用sealed机制。

    1.1K20

    【C++】从零开始认识继承

    这得追溯到遥远的过去,当时的程序员们发现,许多类的属性和方法都是相似的,于是他们想出了一个绝妙的主意:为什么不把这些相似的部分提取出来,形成一个"父类",而其他的类则通过"继承"这个父类来获得这些属性和方法呢...通过继承联系在一起的类构成一种层次关系,通常在层次关系的根部有一个基类(base class),其他类则是直接或间接地从基类继承过来的,这些继承来的类成为派生类(derived class)。...寓意把派生类中父类那部分切来赋值过去。 基类对象不能赋值给派生类对象。 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。...3.4 派生类的默认成员函数 6个默认成员函数,默认的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?...派生类对象析构清理先调用派生类析构再调基类的析构。 因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲解)。

    8110

    多态

    所以析构函数的重写只需要在基类上加上virtual就可以构成重写。 为什么对析构函数进行重写呢?...:修饰虚函数,表示该函数不能被重写 override:检查派生类中虚函数有没有被重写,没有被重写就会报错 抽象类 包含纯虚函数的类,叫做抽象类。...teacher& y = b; y.print(); return 0; } 运行结果: 分析 x调用print直接去基类的虚表中找 y调用print去派生类的虚表中找,此时的虚表中的...要想观察这个调用print是什么方式的,需要看一下汇编代码。 单继承虚函数表 上面那个代码就是单继承,但是上面那个代码中,派生类没有写自己的虚函数,只是不继承的虚函数重写了。...当我们调换派生类中print和f2的位置的时候也是打印相同的结果;说明虚表中先继承基类的虚函数然后再放自己的虚函数。基类的虚函数是按声明的顺序储存在虚表中。

    25920

    领悟面向对象就离开发应用不远了(类提高)有你对面向对象的所有疑问,爆肝1w字

    虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。...这里“重写”的要求是函数的特征标(包括参数的数目、类型和顺序)以及返回值都必须与基类中的函数一致。...基类中 可以在基类中将被重写的成员函数设置为虚函数,其含义是:当通过基类的指针或者引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。...这样就可以将基类与派生类的同名方法区分开,实现多态。 3.抽象基类 不能实例化的基类被称为抽象基类, 这样的基类只有一个用途, 那就是从它派生出其他类。...② 类之间应满足子类型关系,通常表现为一个类从另一个类公有派生而来。 ③ 必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。

    53120

    C++进阶-多态

    virtual void BuyTicket() { cout << "买票-全价" << endl; } }; 虚函数重写: 派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型...virtual 在重写基类虚函数时,派生类的虚函数在不加virtual关键字也可以构成重写 原因: 继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性) 示例: class Person...如果基类的虚函数不加virtual,派生类的虚函数加virtual,这种情况是不构成虚函数的 析构函数的重写 我们知道,基类指针和引用可以指向基类和派生对象,由此通过指针和引用释放对象时需要实现析构的多态...一般情况这个数组最后面放了一个nullptr(用来表示结束)(可能根据编译器而定) 派生类的虚表生成总结: 先将基类中的虚表内容拷贝一份到派生类虚表中 如果派生类重写了基类中某个虚函数,...0; } 示图: 说明: 多继承派生类的未重写的虚函数放在第一个继承基类部分的虚函数表中 为什么对于两个虚函数func1的覆盖地址会不一样?

    60730
    领券