首页
学习
活动
专区
工具
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 赋值过程中的类型转换...如果赋值运算符两侧的类型不一致,但都是数值型或字符型,在赋值时可以自动进行类型转换。...(4)字符型数据可以赋值给整型变量,此时存入的是字符的ASCII码。

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

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

    3.1K50

    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引用的就是Activity的Token。...,它的逻辑是这样的: 如果窗口类型为SUB_WINDOW(即子窗口),就会把mParentWindow对应的ViewRootImpl的mWindow赋值给token(上一个回答也有相关介绍); 窗口类型为...因为普通应用的Window等级比系统Window低,所谓小庙容不下大佛; 窗口类型为APPLICATION_WINDOW(Activity主Window和普通的Dialog就是这个类型),会把mParentWindow...那为什么把Window的type指定为SYSTEM_WINDOW类型就能找到容器了呢?

    4.4K11

    Python常见编程基础问题总结

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

    1.1K20

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

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

    59500

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

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

    48930

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

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

    31040

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

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

    1.3K31

    C++临时变量的常量性

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

    2K31

    python入门-变量和赋值

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

    29940

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

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

    37720

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

    2.基类和派生类对象赋值转换 Person p; Student s; p = s; s = p;//这种写法是不行的,即使强制类型转换也不行 s = (Person)p;//错误写法 1...p = s,s = p这两种转换分别向上转换和向下转换,叫做子给父叫做向上转换。向上转换是可以的,不同的类型赋值,不管走的是隐式类型还是强制类型,中间都会产生临时变量。 ...(ps:这个我们后 面再讲解,这里先了解一下) 扩展一个小知识:类型转换分为强制类型转换和隐式类型转换。 从对象的角度来说,父对象是不能给子对象的。 3.继承中的作用域 1....为什么会自动调用,因为它要保证析构的顺序。 把一个子对象分成父的部分和子的部分,父类对象先构造和初始化,如果有两个子类对象,析构的时候后定义的先析构,也就是子的部分先析构。...子类析构函数完成后,自动调用父类析构,这样就保证了先子父,显示调用父类析构是没办法保证先子后父的: 为什么要先子后父?

    12310

    尤达表达式

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

    68520

    C++的类型转换

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

    6910

    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

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

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

    87040

    谈谈「数据模型」是如何解决前端数据处理的痛点

    3.渲染数据 给当前Vue实例赋值,然后在template里通过模板语法进行渲染 可以看到常规写法,模板语法里面的写法特别不优雅,各种保护性代码(条件判断) 六、通过数据模型方式处理 1.定义数据模型...且在脚本里面没有了数据格式化处理代码,从而不会因为数据处理逻辑代码可能存在的错误,打断UI的渲染。...,最后给事先定义好的属性赋值,在赋值的过程中,可以根据type格式化一些类似时间、价格类型的数据。...traverse方法刚好和parse相反,同样是遍历数据模型结构,拿到每个属性的数据路径,然后根据这个数据路径去设置一个新对象的值,这期间,反向格式化数据类型,最后返回这个新对象。...(文末有送书规则,一定要看) 每个前端工程师都应该了解的图片知识(长文建议收藏) 为什么现在面试总是面试造火箭?

    2.1K41
    领券