类型兼容规则

定义:
类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。
因为公有继承,派生类得到了基类除了构造函数,析构函以外的所有成员。这样,公
有派生类实际具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解
决。
类型兼容规则所指的替代包括以下的情况:
1.派生类的对象可以隐含转换为基类的对象。
2.派生类的对象可以初始化基类的引用。
3.派生类的指针可以隐含转化为基类的指针。
注意:在替代之后,派生类的对象就可以作为基类的对象使用,但只能使用从基类继承
的成员。
例如:
class B{...}
class D:public B{...}
B b1,*pb1;
D d1;
这时,
(1)派生类对象就可以隐含转换为基类的对象,即使用派生类对象中从基类继承来的成
员,逐个赋值给基类对明象成员:
b1 = d1;
(2)派生类的对象也可以初始化基类对象的引用:
B &rb = d1;
(3)派生类对象的地址也可以隐含转化为指向基类的指针:
pb1 = &d1;
好处:
由于类型兼容规则的引入,对于基类及公有派生类的对象,可以使用相同的函数统一进行
处理,因为当函数的形参为基类的对象(或引用、指针)时,实参可以派生类的对象(或指针)
,而没有必要为每一个类设计一个单独的模块,大大提高了程序的效率,这正是c++的又一特色,
即多态性,可以说类型兼容规则是多态的重要基础之一。

时间: 2024-10-09 16:04:56

类型兼容规则的相关文章

5、继承与派生3-类型兼容规则

1.类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员.这样公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决.类型兼容规则中所指的替代包括以下的情况: a.派生类的对象可以赋值给基类对象 b.派生类的对象可以初始化基类的引用. c.派生类对象的地址可以赋给指向基类的指针. 在替代之后,派生类对象可以作为基类的对象使用,但只鞥使用从基类继承的成员. eg: class B {

C++基础6 【继承】 类型兼容 satatic 多继承 虚继承 【多态】 案例 虚析构函数 重载重写重定义

[继承] 继承的访问控制域 图 类型兼容性原则  指针 与 引用 用子类直接初始化父类 类的继承模型示意 图 [继承结论] [非常重要的概念] 继承与组合混搭情况下,构造和析构调用原则 原则:先构造父类,再构造成员变量.最后构造自己 先析构自己,在析构成员变量.最后析构父类 继承中,同名的成员变量的处理办法 继承中,同名的成员函数的处理办法 派生类中的static关键字 如果静态成员变量,你没有使用,也没有初始化的话 编译不会报错 经典错误 : 类中函数默认是private的,无法在外部访问 具

C++:同名隐藏和赋值兼容规则

一.同名隐藏 同名隐藏,即在C++的继承中,只要子类的函数名和父类的函数名相同,子类中的函数将会隐藏所有父类中和子类的成员函数同名的函数 特别注意: 和函数之间的重载不同,这里只要求函数的名字相同,而对函数的参数列表是否相同不做要求.话句话说父类中和子类的成员函数名相同但参数列表不同的成员函数也会被隐藏 示例: 1 #include<iostream> 2 using namespace std; 3 class Father{ //父类 4 public: 5 Father()=defaul

C++语言笔记系列之十六——赋值兼容规则&amp;多继承的二义性

1.赋值兼容规则 (1)派生类对象可以给基类对象赋值,这种情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:但是不允许将一个基类的对象赋值给一个派生类. (2)可以将派生类对象的地址赋给基类指针,使基类指针指向派生类对象,通过基类指针引用成员时只可以引用派生类从基类继承而来的成员,而不允许引用派生类的新成员. (3)引用与指针相同. 2.多继承 (1)一个派生类从两个以上的基类中去继承. (2)说明: class 派生类名:继承方式 基类1, 继承方式 基类2,...... {派生类成员

赋值兼容规则(C++)

在一定条件下,不同类型的数据之间可以进行类型转换,如可以将整型数据赋给双精度型变量.在赋值之前,先把整型数据转换成双精度型数据,然后再把它赋给双精度型变量.这种不同类型数据之间的自动转换和赋值,称为赋值兼容.在基类和派生类对象之间也存有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用其子类对象来代替. 下面主要讲积基类和派生类对象之间的赋值兼容1·派生类的对象可以赋值给基类对象. ? ?A a1; //定义基类A对象a1 ? ?B b1; //定义类A的公

TypeScript 类型兼容

在TS中有非常怪异的类型兼容的问题 : 如下 interface  LengthWish{     length : number; } class A{     length : number;     constructor(){         this.length = 2;     } } //定义一个LengthWish类型的变量 let _l : LengthWish = new A(); console.log(`length value is : ${ _l.length }`

【总结】C++基类与派生类的赋值兼容规则

在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则: 1.子类对象可以赋值给父类对象(切割/切片) 在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生"is-a"的关系,这种关系会导致子类中有结构的嵌套这父类的信息,.所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功.若为私有继承,则会产生"has-a"的关系,这种关系是从属关系,基类中的数据仅仅是包含在派生类中,若赋值,则不会产生类似于降级的事

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则

背景:    最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言:      右值引用无疑是C++11新特性中一颗耀眼的明珠,在此基础上实现了移动语义和完美转发,三者构成了令很多C++开发者拍案叫绝的“铁三角”(当然不是所有C++开发者).而在这个“铁三角”中,有一个无法回避的关键细节,那就是引用叠加规则和模板参数类型推导规则.其实,关于这两个规则,可查到的资料不少,但都