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

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

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

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

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

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

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

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

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

相关·内容

abstract virtaul override new 及多态

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

74730

C#Abstract 、Virtual和Override使用

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

1.2K20

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

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

3.7K31

学习记录——抽象和密封

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

35031

C++多态

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

81920

再探虚函数

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

85220

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

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

1.1K20

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

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

38930

多态

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

23220

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

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

5610

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

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

50820

C++进阶-多态

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

56530

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修饰符 如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象

41820

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

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

7110

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

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

44030

派生类多态虚函数?

成员函数与继承派生类可以继承其成员, 然而有时候派生类必须对其重新定义。派生类需要对这些操作提供自己新定义以覆盖继承而来旧定义。...任何构造函数之外非静态函数都可以是虚函数。 关键字virtual只能出现在内部声明语句之前而不能用外部函数定义。 如果把一个函数声明成虚函数,则该函数在派生类也是虚函数。...派生类可以继承定义在成员,但是派生类成员函数不一定有权访问继承而来成员。 和其他使用代码一样,派生类能访问公有成员,而不能访问私有成员。...现在,我们只需知道访问说明符作用是控制派生类继承而来成员是否对派生类用户可见。 如果一个派生是公有的,则公有成员也是派生类接口组成部分。...此外,我们能将公有派生类型对象绑定到引用或指针上。 大多数都只继承自一个,这种形式继承被称作“单继承”。 派生类虚函数派生类经常(但不总是)覆盖它继承虚函数。

14720

【C++修炼之路】16.C++多态

2.2 虚函数重写 虚函数重写(覆盖):派生类中有一个跟完全相同虚函数(即派生类虚函数与虚函数返回值类型、函数名字、参数列表完全相同),称子类虚函数重写虚函数。...那虚函数重写与继承隐藏有什么关系? 回忆一下隐藏(重定义):派生类成员函数名字相同,则成员函数被派生类隐藏。...因为传入是非Person,函数类型为引用,并且切片不会改变类型,但是对于引用/指针来说,Funcp代表就是派生类Person那一部分,传入什么,就是什么,只不过选取部分是部分...3.3 场景问题1 顾名思义,我们已经知道重写是将接口拿来,然后将派生类内容覆盖,也就是说函数名是属于(这也说明了派生类可以写virtual原因),那参数需不需要重写?...总结一下派生类虚表生成:a.先将虚表内容拷贝一份到派生类虚表 b.如果派生类重写某个虚函数,用派生类自己虚函数覆盖虚表虚函数 c.派生类自己新增加虚函数按其在派生类声明次序增加到派生类虚表最后

47000

【C++】一文简练总结【多态】及其底层原理&具体应用(21)

一个含有虚函数中都至少都有一个虚函数表指针,因为虚函数地址要被放到虚函数表,虚函数表也简称虚表 2)虚函数重写(覆盖) 虚函数重写(覆盖): 派生类中有一个跟完全相同虚函数 (即派生类虚函数与虚函数返回值类型...(因 为继承后虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议 这样使用*/ /*void BuyTicket() { cout << "买票-半价" << endl...Person ps; Student st; Func(ps); Func(st); return 0; } 4)虚函数重写两种特殊情况: 【1】协变:(派生类虚函数返回值类型不同) 派生类重写虚函数时...,与虚函数 返回值类型不同 。...:(派生类析构函数名字不同) 如果 析构函数为虚函数 ,此时派生类析构函数只要定义, 无论是否加virtual关键字 , 都与析构函数构成重写,虽然派生类析构函数名字不同。

10710

【多态】【虚表指针与虚表】【多继承多态】

cout << " PersonBuyTicket()" << endl; } }; 3.虚函数重写(覆盖) 派生类中有一个跟完全相同虚函数(即派生类虚函数与虚函数 返回值类型、函数名称...4.虚函数重写三个例外 ① 协变 ( 派生类虚函数返回值类型不同 ) 派生类重写虚函数时候,与虚函数返回值类型不同。...,继承下来之后就有了 virtual 属性了,派生类只是重写了这个 virtual 函数。...函数名相同即可 两个派生类同名函数构成重写的话则构成隐藏 Ⅲ....总结一下派生类虚表生成: 先将虚表内容拷贝一份到派生类虚表 如果派生类重写某个虚函数,用派生类自己虚函数覆盖虚表虚函数 派生类自己新增加虚函数按其在派生类声明次序增加到派生类虚表最后

1.1K30

多态讲解

cout << "买票-全价" << endl; } }; 虚函数重写 虚函数重写(覆盖):派生类中有一个跟完全相同虚函数(即派生类虚函数与虚函数返回值类型、函数名字、参数列表完全相同...,这就是多态体现,如果是学生就是半票,不是学生就是全票 另外大家要注意: 在重写虚函数时,派生类虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后虚函数被继承下来了在派生类依旧保持虚函数属性...: 协变(派生类虚函数返回值类型不同) 派生类重写虚函数时,与虚函数返回值类型不同。...(派生类析构函数名字不同) 如果析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与析构函数构成重写,虽然派生类析构函数名字不同。...总结一下派生类虚表生成: a.先将虚表内容拷贝一份到派生类虚表 b.如果派生类重写某个虚函数,用派生类自己虚函数覆盖虚表虚函数 c.派生类自己新增加虚函数按其在派生类声明次序增加到派生类虚表最后

5510
领券