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

为什么子类型赋值和常规赋值的错误不同?

子类型赋值和常规赋值的错误之所以不同,是因为它们涉及到不同的类型转换和类型检查机制。

在编程中,子类型赋值是指将一个派生类的实例赋值给其基类的引用或指针。这种赋值通常是合法的,因为派生类对象具有基类对象的所有属性和方法。子类型赋值的错误通常发生在以下情况下:

  1. 类型不匹配:如果将一个派生类的实例赋值给与其不兼容的基类引用或指针,就会发生类型不匹配错误。例如,将一个子类的对象赋值给一个没有定义子类的基类引用。
  2. 多重继承:如果一个派生类同时继承了多个基类,而这些基类具有相同的方法或属性名称,那么在子类型赋值时可能会发生二义性错误。
  3. 访问权限:如果派生类中的某些成员具有私有或受保护的访问权限,而基类引用或指针无法访问这些成员,那么在子类型赋值时可能会发生访问权限错误。

相比之下,常规赋值是指将一个变量的值赋给另一个变量。常规赋值的错误通常发生在以下情况下:

  1. 类型不匹配:如果将一个不兼容的数据类型赋值给一个变量,就会发生类型不匹配错误。例如,将一个字符串赋值给一个整数类型的变量。
  2. 范围溢出:如果将一个超出目标变量范围的值赋给该变量,就会发生范围溢出错误。例如,将一个超过整数类型最大值的数值赋给一个整数变量。
  3. 未初始化变量:如果将一个未初始化的变量的值赋给另一个变量,就会发生未初始化错误。未初始化的变量可能包含随机值或垃圾值,导致程序行为不可预测。

总结起来,子类型赋值和常规赋值的错误不同是因为它们涉及到不同的类型转换和类型检查机制。子类型赋值错误通常涉及到派生类和基类之间的关系,而常规赋值错误通常涉及到数据类型的匹配和范围限制。

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

相关·内容

C++ 强制类型转换赋值类型转换

强制类型转换 原C语言形式: (类型名)(表达式) 比如: (double)a //把a转换为double类型 (int)(a+b) //把a+b值转换为整型 需要注意是:如果强制类型转换对象是一个变量...(int)(a+b) //把a+b值转换为整型 (int)a+b //把a值转换为整型,然后加b C++新增加形式: 类型名(表达式) 该形式类型名不需要括括号,但是待转换对象不管是变量还是表达式都需要用括号括起来...3.6; i = (int)x; cout<<"x = "<<x<<",i = "<<i<<endl; getchar(); return 0; } 运行结果: x = 3.6,i = 3 <em>赋值</em>过程中<em>的</em><em>类型</em>转换...如果<em>赋值</em>运算符两侧<em>的</em><em>类型</em>不一致,但都是数值型或字符型,在<em>赋值</em>时可以自动进行<em>类型</em>转换。...(4)字符型数据可以<em>赋值</em>给整型变量,此时存入<em>的</em>是字符<em>的</em>ASCII码。

1.6K10
  • 【Verilog】深入理解阻塞非阻塞赋值不同

    为什么一定要这样做呢?回答是,这是因为要使综合前仿真综合后仿真一致缘故。如果不按照上面两个要点来编写Verilog代码,也有可能综合出正确逻辑,但前后仿真的结果就会不一致。...若有两条或两条以上语句准备在同一时刻执行,但由于语句排列次序不同(而这种排列次序不同是IEEE Verilog标准所允许), 却产生了不同输出结果。...这就是造成Verilog模块冒险竞争现象原因。为了避免产生竞争,理解阻塞非阻塞赋值在执行时间上差别是至关重要。 阻塞赋值 阻塞赋值操作符用等号(即 = )表示。为什么称这种赋值为阻塞赋值呢?...这清楚地说明这个Verilog模块是不稳定会产生冒险竞争情况。 非阻塞赋值 非阻塞赋值操作符用小于等于号 (即 <= )表示。为什么称这种赋值为非阻塞赋值?...非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在"initial"块"always"块等过程块中。非阻塞赋值不允许用于连续赋值。下面的例子可以说明这个问题: [例2].

    3K50

    C# 遍历读取某个目录文件夹下不同类型文件文件夹(里面可能又有许多文件)

    首先获取到文件目录,这里是参数targetDirectory传递进来: //对该路径下文件进行遍历,获取文件名  string[] fileEntries = Directory.GetFiles...                foreach (string fileName in fileEntries)                     if (fileName.EndsWith(".mdb"))  // 比较不同点...if (fileName.EndsWith(".txt"))  // 比较不同点: mdb是一种文件,而gdb是文件夹,里面包含多个文件                         messagebox.Show...(fileName);                      //此处可以写代码:添加if判断,显示txt等其他类型文件...                ...//对该路径下 文件夹 进行遍历,获取文件夹                 string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory

    3.8K10

    Dialog 对应 Context 必须是 Activity吗?

    今天我们就来彻底搞清楚这一块,问题来了: 1、为什么传入一个非 Activity context 会出现错误? 2、传入 context 一定要是 Activity 吗?...为什么会这样? 常规Dialog容器是Activity,所以它窗口属性token引用就是ActivityToken。...,它逻辑是这样: 如果窗口类型为SUB_WINDOW(即窗口),就会把mParentWindow对应ViewRootImplmWindow赋值给token(上一个回答也有相关介绍); 窗口类型为...因为普通应用Window等级比系统Window低,所谓小庙容不下大佛; 窗口类型为APPLICATION_WINDOW(Activity主Window普通Dialog就是这个类型),会把mParentWindow...那为什么把Windowtype指定为SYSTEM_WINDOW类型就能找到容器了呢?

    4.2K00

    Python常见编程基础问题总结

    另外,一个函数重载基本设计原则是,仅仅当两个函数除了参数类型参数个数不同以外,其功能是完全相同,此时才使用函数重载,如果两个函数功能其实不同,那么不应当使用重载,而应当使用一个名字不同函数。...为什么说 Python 是动态语言 在 Python 中,等号 = 是赋值语句,可以把任意数据类型赋值给变量,同样一个变量可以反复赋值,而且可以是不同类型变量,例如: a = 100 # a是int...型变量 print(a) a = 'ABC' # a 是str型变量 print(a) Pyhon 这种变量本身类型不固定,可以反复赋值不同类型变量称为动态语言,与之对应是静态语言。...当浅复制值是不可变对象(数值,字符串,元组)时=“赋值情况一样,对象 id 值与浅复制原来值相同。 2、复制可变数据类型: 直接赋值:其实就是对象引用(别名)。...,它会根据对象(或类)类型不同而表现出不同行为。

    1K20

    C++随记(五)---const 与 指针

    两者都可以用来定义常量,但是const定义时,定义了常量类型,所以更精确一些。 const指针一起用时会有些有趣,我们下面一一分析一下各种情况: 1、指针指向一个常量对象。...后面的博文中有机会会看到这样例子。 注意:     ①上面代码例子,我是将一个常规变量 地址赋值给了指向const指针。这是合法。    ...③将 常规变量地址赋值常规指针,这个就是我们常见操作,不讨论了;     ④将 const变量地址 赋值常规变量指针,不合法!!!    ...例如: const int day= 3; int * pt3 = & day; //不合法         为什么不合法?...将指针参数声明为指向常量数据指针有两条理由: · 这样可以避免由于无意间修改该数据而导致编程错误; · 使用const使得函数能够处理const非const实参,就如我上述①②,否则只能接受非

    58000

    HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 一)

    常规变量:没有状态变量,通常应用于辅助计算。它改变永远不会引起UI刷新。 数据源/同步源:状态变量原始来源,可以同步给不同状态数据。通常意义为父组件传给组件数据。...管理应用拥有状态装饰器:应用级别的状态管理,可以观察不同页面,甚至不同UIAbility状态变化,是应用内全局状态管理。...管理组件拥有的状态,即图中Components级别的状态管理: @State:@State装饰变量拥有其所属组件状态,可以作为其组件单向双向同步数据源。...class或者Object时,可以观察到自身赋值变化,其属性赋值变化,即Object.keys(observedObject)返回所有属性。...// class类型赋值 this.title = new Model('Hi', new ClassA('ArkUI')); 对@State装饰变量属性赋值

    44830

    深入 TypeScript 中类型、逆变、协变,进阶 Vue3 源码前必须搞懂

    ,或者在写一些复杂类型时候看到别人可以这么写,但是不知道为什么他可以生效。...从可赋值性角度来说,子类型是可以赋值给父类型,也就是 父类型变量 = 子类型变量 是安全,因为子类型上涵盖了父类型所拥有的一切属性。...当我初学时候,我会觉得 T extends {} 这样语句很奇怪,为什么可以 extends 一个空类型并且在传递任意类型时都成立呢?当搞明白上面的知识点,这个问题也自然迎刃而解了。.../型别关系用语。...描述比较晦涩难懂,但是用我们上面的动物类型例子来解释一波,现在我们还是有 Animal Dog 两个父子类型

    1.3K31

    掌握Rust:从零开始所有权之旅

    作用域销毁 借用 修改 可变借用 所有权原则 内部可变性 生命周期 总结 移动?拷贝? 先来试试常规赋值语句在Rust有什么样表现 println!...看起来都是初始化赋值操作,分别将数字 a 字符串 d 多次赋值给别的变量 为什么字符串赋值失败了。...Tips,Rust在编译阶段就能分析出很多代码问题,这也是为什么前边错误里没有打印“start”,因为编译就失败了 Rust里对“引用”有细分,这里叫借用(Borrow),至于为什么,我们后边讲 从目前代码看...基本之前不可变(immutable)变量销毁类似,唯一不同赋值后,赋值值要被销毁,内存管理很是细致啊。...Rust 提供了Cell(针对实现Copy简单类型RefCell(针对任何类型,运行时做借用检查)Arc(多线程安全引用计数类型)等类型,来支持内部可变性。

    30040

    C++临时变量常量性

    出错原因是编译器根据字符串"hello world"构造一个string类型临时对象,这个临时变量具有const属性,当这个临时变量传递给非conststring&引用类型时,无法隐式完成const...到非const类型转换,便出现上面的编译错误。...2.临时变量常量性原因 为什么临时对象作为引用参数传递时,形参必须是常量引用呢?很多人对此解释是临时变量是常量,不允许赋值改动,所以作为非常量引用传递时,编译器就会报错。...注意,这里与《C++编程思想》在第八章中“临时量”小节中认为“编译器使所有的临时量自动设为const”说法有些不同。 那编译器为何作出如此限制呢?...const引用实参这个语义限制,意在限制这个非常规用法潜在错误

    2K31

    python入门-变量赋值

    变量本身是没有类型,只是对象(赋值数据)有类型 a = 66 a 66 b = 66 b 66 type(a) # 查看数值类型为整型int int type(b) # 字符串类型 int...为什么?其实,这两数值6677本质上在计算机就是两个对象,只不过它们刚好有个相同名字而已。...好比说,西游记有个情节:真假美猴王 真美猴王(数值66)假美猴王(数值77)虽然都被称为猴子(标签a),但是他们实际上是两只不同猴子呀(分配了不同地址)~假最后不还是被如来给收服啦!...就是三个不同变量) 变量名不能Python中关键字冲突(相同),否则无效 下面我们看看Python中常见赋值方法 赋值语句 常规赋值 赋值:将Python某个数据对象贴在某个变量上,好像给这个对象贴上了一个标签...False 我们查看下二者内存地址,发现它们地址真的不同,所以肯定不是同一个对象啦~ id(number3) 4444408880 id(number4) 4444409104 这到底是为什么呢?

    28840

    WPF Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null

    (当然我们这里讨论常规编程手段,如果非常规手段,你甚至可以让实例 this 为 null 呢……) ---- 由于本文所述两个部分都略长,所以拆分成两篇博客,这样更容易理解。...由于 _dispatcher 字段是私有字段,所以仅需调查这个类本身即可找到所有的赋值时机。(反射等非常规手段需要排除在外,因为这意味着开发者是逗比——自己闯祸不能怪 WPF 框架。)...类型 DummyInheritanceContext 属性调用此方法 而 Application 类型不是以上任何一个类型子类(Application 类直接基类是 DispatcherObject...结论 总结以上所有的分析: Application 类型实例在初始化之前,Dispatcher 属性就已经被赋值且不为 null; 所有可能改变 _dispatcher 属性常规方法均与 Application...类型无关; 因此,所有常规手段均不会让 Application 类 Dispatcher 属性拿到 null 值。

    35420

    C++类型转换

    C语言中类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式类型转换:隐式类型 转换显式类型转换..., p, address); } 缺陷: 转换可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误转换 2....为什么C++需要四种类型转换 C风格转换格式很简单,但是有不少缺点: 1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失 2....,就支持A转int值bool了。...只能用于父类含有虚函数类 2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0 给父亲 父给 图中指针可以互相转换,但是不安全 4.

    6510

    尤达表达式

    为什么要避免使用尤达表达式   评判一个东西好坏,通常都需要比较。...那就先看看尤达表达式有什么优缺点 优点 捕捉编写程序意外引起错误   例如以下判断,由于判断相等少写了一个=号,导致程序运行中发生意外赋值操作 if (number = 7) { /* code *...side in assignment 解决不安全null类型操作   例如Java中equals比较 String myString = null; if (myString.equals("hehe...; if ("hehe".equals(myString)) { /* code */ } 缺点   与常规编程直线思维相悖,造成代码阅读理解上不顺畅,缺乏可读性。...总结   尤达表达式优点,其实可以通过其他方式去避免所犯错误。例如第一个条件语句写成赋值语句,可以由代码检查工具检测出来。反而是可读性缺陷,影响多人写作开发维护。所以,要避免使用尤达表达式。

    67220

    C++ 练气期之细聊字符串

    字符串基本组成元素是字符,可以认为字符串就是字符类型数组。 量变总会引起质变,字符串是由字符量变演化出类型, 2 者在数据含义存储结构都有着本质上区别。...1.1 数据含义 C++把字符类型当成整型数据类型看待。如下代码,当把A赋值给myChar时, 编译器先获取A底层 ASCII 编码,然后再把编码值赋值给myChar。...int myChar='A'; cout<<myChar; //输出:65 如下代码,编译器先找到97对应字符,然后再赋值给myChar,字符类型整型类型语法层面有差异,在底层,C++一视同仁。...2.3.1 复制操作 C++中数组之间是不能直接赋值,如下是错误: char myStr[6]="HELLO"; char myStr_[6]; //错误 myStr_=myStr; 可以使用cstring...2.3.5 字符串查找 在原子符串中查找给定字符串出现位置,返回此位置指针地址。

    1.3K20

    C#中委托事件 - Part.1

    本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件由来、.Net Framework中委托事件、委托事件对Observer设计模式意义,对它们中间代码也做了讨论。...注意这里,第一次用“=”,是赋值语法;第二次,用是“+=”,是绑定语法。如果第一次就使用“+=”,将出现“使用了未赋值局部变量”编译错误。...但是,不管是赋值还是注册,都是将方法绑定到委托上,除了调用时先后顺序不同,再没有任何分别,这样不是让人觉得很别扭么?...事件委托编译代码 这时候,我们注释掉编译错误行,然后重新进行编译,再借助Reflactor来对 event声明语句做一探究,看看为什么会发生这样错误: public event GreetingDelegate...// 省略... .Net Framework中委托与事件 尽管上面的范例很好地完成了我们想要完成工作,但是我们不仅疑惑:为什么.Net Framework 中事件模型上面的不同

    1.1K40

    剖析深拷贝与浅拷贝,探究重载返回引用还是对象

    上面这句话说真的稀里糊涂,第一次看到这句话,肯定一脸懵逼,实际上将上述话差分开就是解决两个问题: (1) 深拷贝浅拷贝? (2) c++中有些重载运算符为什么要返回引用?...1.深拷贝浅拷贝 这里先阐述一下C++对象中两个概念,分别是拷贝操作与赋值操作!...答案就是:一般,我们我们需要手动编写析构函数类,都需要overload 拷贝函数赋值运算符。...同时,赋值函数首先要释放掉对象自身堆空间(如果需要的话),然后进行其他operation.而拷贝函数不需要如此,因为对象此时还没有分配堆空间。 2.C++中有些重载运算符为什么要返回引用?...原因有两个: 允许进行连续赋值 防止返回对象(返回对象也可以进行连续赋值常规情况,如a = b = c,而不是(a = b) = c))时候调用拷贝构造函数析构函数导致不必要开销,降低赋值运算符效率

    86040

    在 WordPress 中使用尤达条件表达式防止意外赋值

    作为一个程序员,写代码时候发生拼写错误是再正常不过事情,很多拼写错误可能造成语法错误,IDE 和解释器会提示,然后可以很快得到修改。...为什么要用尤达表达式 尤达表达式主要用于捕捉编写程序意外引起错误。...例如以下判断,由于判断相等少写了一个=号,导致程序运行中发生意外赋值操作: // 拼写错误,不小心把 == 写成了 = if ( $post_type = 'post' ) { /* code */...所以尤达表达式还是很有帮助,但是它缺点也很明显,与常规编程直线思维相悖,造成代码阅读理解上不顺畅,缺乏可读性。...WordPress 尤达表达式 WordPress PHP 编码规范是支持尤达表达式用法,因为当时 PHP 世界几乎没有任何静态分析工具可用,防止在条件表达式中意外赋值唯一“万无一失”方法是反转被检查变量顺序

    55040
    领券