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

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

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

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

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

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

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

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

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

相关·内容

abstract virtaul override new 及多态

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

77430

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.1K31

    学习记录——抽象和密封

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

    37131

    【C++】———— 多态

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

    10910

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

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

    11310

    C++多态

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

    83920

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

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

    12410

    再探虚函数

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

    87020

    十、继承

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

    7010

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

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

    8010

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

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

    50331

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

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

    1.1K20

    多态

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

    25620

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

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

    7510

    C++进阶-多态

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

    59630

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

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

    52820

    C#基础知识之base、this、new、override、abstract梳理

    一、Base关键词几种用法 base重要用于OOP多态上,base 关键字用于在派生类实现对公有或者受保护成员访问,但是只局限在构造函数、实例方法和实例属性访问器 1、base调用构造函数...public B() : base() { Console.WriteLine("Build B"); } } } 执行结果: 2、base在派生类调用方法...new 关键字可以显式隐藏继承成员。...{ new public string Name { get; set; } = "dachong"; } 3、new 约束:用于在泛型声明约束可能用类型参数参数类型 new 约束指定泛型声明任何类型参数都必须有公共无参数构造函数...抽象不能定义为密封(sealed),抽象方法不能使用virtual、static、private修饰符 如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象

    44920

    【C++】从零开始认识多态

    继承就是可以将对象进行继承,派生类会继承功能与属性,类似父与子关系。比如水果和苹果,苹果就有水果特性。 接下来我们就来了解学习多态!...(即派生类虚函数与虚函数返回值类型、函数名字、参数列表完全相同),称子类虚函数重写虚函数 看起来很是简单,当时其实有很多坑!!!...协变:派生类重写虚函数时,与虚函数返回值类型不同: 虚函数返回对象指针或者引用 派生类虚函数返回派生类对象指针或者引用 这样情况称为协变。...首先: A与B构成继承关系 func函数是虚函数(B派生类,可以写virtual),并且AB 满足三同。构成多态。...重定义: 两个函数分别在作用域好派生类作用域 仅仅函数名相同 两个派生类同名函数不是重写就是重定义 重定义包含重写!!!

    8710

    C++入门到精通(第九篇) :多态

    派生类虚函数在不加virtual关键字时,虽然也可以构成重写(因为继 承后虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议这样使用 */ /*void BuyTicket...: 协变(派生类虚函数返回值类型不同) 派生类重写虚函数时,与虚函数返回值类型不同。...(派生类析构函数名字不同) 如果析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与 析构函数构成重写,虽然派生类析构函数名字不同。...总结一下派生类虚表生成:a.先将虚表内容拷贝一份到派生类虚表 b.如果派生类重写 某个虚函数,用派生类自己虚函数覆盖虚表虚函数 c.派生类自己新增加虚函数按其在 派生类声明次序增加到派生类虚表最后...对于虚函数会在对象成员变量中生成虚函数表指针,指向虚函数表中储 了该对象虚函数地址 对于派生类会继承虚函数表,如果派生类重写了虚函数,则会对继承虚函数表对应函数地址进行覆盖成派生类对象虚函数

    45630
    领券