【C++学习笔记】类型兼容规则

0x00 前言

文章中的文字可能存在语法错误以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

本文档为个人边学习边记录的C++笔记,非教程,笔记中会存在引用他人文章内容的部分,被引用的原文不会被特殊标记出来,但会在参考文档中给出原文链接。

0x01 类型兼容规则

类型兼容规则就是指在需要基类对象的任何地方,都可以使用共有派生类的对象来替代 。

凡是基类能够解决的问题,共有派生类都可以解决。

类型兼容规则中所指的替代包括以下情况:
·派生类的对象可以隐含转换为基类对象。
·派生类的对象可以初始化基类的引用。
·派生类的指针可以隐含转换为基类的指针。

在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。

在如下程序中,b1为B类对象,d1为D类对象:

class B {...}
class D:public B {...}
B b1, *pb1;
D d1;

这时:
(1)派生类对象可以隐含转换为基类对象,即用派生类对象中从基类继承来的成员,诸葛赋值给基类对象的成员;

b1 = d1;

(2)派生类对象也可以初始化基类对象的引用:
B &rb = d1;

(3)派生类对象的地址也可以隐含转换为指向基类的指针:
pb1 = &d1;

由于类型兼容规则的引入,对于基类及其公有派生类的对象,可以使用相同的函数统一进行处理。因为当函数形参为基类的对象(或引用、指针)时,实参可以是派生类的对象(或指针),而没有必要为每一个类设计单独的模块,大大提高了程序的效率。

例:类型兼容规则实例:

在这里插入图片描述

类派生关系的UML图形表示

#include<iostream>
using namespace std;

class Base1{
public:
	void display() const {cout << "Base1::display()" << endl;}
};

class Base2: public Base1{
public:
	void display() const {cout << "Base2::display()" << endl;}
};

class Derived: public Base2{
public:
	void display() const {cout << "Derived::display()" << endl;}
};

void fun(Base1 *ptr){
	ptr->display();
}

int main(){
	Base1 base1;
	Base2 base2;
	Derived derived;
	
	fun(&base1);
	fun(&base2);
	fun(&derived);
	
	return 0;
}

运行结果:

Base1::display()
Base1::display()
Base1::display()

虽然根据类型兼容原则,可以将派生类对象的地址赋值给基类Base1的指针,但是通过这个基类类型的指针,却只能访问到从基类集成的成员。

《C++语言程序设计(第4版)》书上所有章节出现的示例源代码随着学习的深入会陆续上传至github,代码为个人手动输入并通过编译,有的示例代码可能没有注释:https://github.com/fyw4/C-plus-plus-learning-example

以上。

参考文档:
郑莉 董渊 何江舟.《C++语言程序设计(第4版)》[M].北京:清华大学出版社。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值