C++ 类型兼容规则

这篇具有很好参考价值的文章主要介绍了C++ 类型兼容规则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。 通过公有继承,派生类得到了基类中除构造函数和析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中指的替代包括以下的情况:

(1)派生类的对象可以隐含转换为基类对象
(2)派生类的对象可以初始化基类的引用
(3)派生类的指针可以隐含转换为基类的指针

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

如果B类为基类,D为B的公有派生类,则D类中包含了基类B中除构造函数和析构函数之外的所有成员。这时根据类型兼容规则,在基类B的对象可以出现在任何地方,都可以用派生类D的对象来替代。

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

class B{...};
class D:public B{...};

B b1;
B *p1;
D d1;

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

b1=d1;

(2)派生类对象也可以初始化基类对象的引用:

B &rb=d1;

(3)派生类对象的地址可以隐含转换为指向基类的指针:

p1=&d1;

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

【例】类型兼容规则实例
基类A以公有继承方式派生出B类,B类再作为基类以公有继承方式派生出C类。基类A中定义了成员函数display(),在派生类中对这个成员函数进行了隐藏。

class A//基类A定义
{
public:
	void display()const
	{
		cout << "显示类A" << endl;
	}
};

class B :public A//公有派生类B定义
{
public:
	void display()const
	{
		cout << "显示类B" << endl;
	}
};

class C :public B//公有派生类C定义
{
public:
	void display()const
	{
		cout << "显示类C" << endl;
	}
};

void fun(A* p)//参数为指向基类A的对象的指针
{
	p->display();//"对象指针->成员名"
}

int main()
{
	A a;
	B b;
	C c;

	fun(&a);
	fun(&b);
	fun(&c);

	return 0;
}

运行结果:
C++ 类型兼容规则,C++,c++,开发语言
这样,通过“对象名.成员名”或者“对象指针->成员名”的方式,就应该可以访问到各派生类中继承自基类的成员。虽然根据类型兼容规则,可以将派生类对象的地址赋值给基类A的指针,但是通过这个基类类型的指针,却只能访问到从基类继承的成员。

在程序中,声明了一个形参为基类A类型的指针的普通函数fun,根据类型兼容兼容规则,可以将公有派生类对象的地址赋值给基类类型的指针,这样,使用fun函数就可以同一对这个类族中的对象进行操作。在程序运行过程中,分别把基类对象、派生类B的对象和派生类C的对象的地址赋值给基类类型的指针p,但是通过p,只能使用继承下来的基类成员。也就是说,尽管指针指向派生类C的对象,fun函数运行时通过这个指针只能访问到C类从基类A继承过来的成员函数display,而不是C类自己的同名成员函数。因此,主函数中3次调用fun的结果是相同的——访问了基类的公有成员函数。

通过这个例子可以看出,根据类型兼容规则,可以在基类对象出现的任何场合使用派生类对象进行替代,但是替代之后派生类对象仅仅发挥出基类对象的作用。文章来源地址https://www.toymoban.com/news/detail-627945.html

到了这里,关于C++ 类型兼容规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

    上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下的 普通函数 与 函数模板 的调用规则 ; 为 函数模板 重载了 普通函数 , 普通函数有指定的类型 ; 传入实参 , 调用 普通函数 还是 模板函数 , 是有一定的规则的 ; 普通函数 与 传入实

    2024年02月21日
    浏览(43)
  • C++语言深度解析--类型系统和类型安全--const和volatile

    目录 1.1类型系统和类型安全 类型系统 类型安全 c++和c的差别 面试题 1.2const和volatile 面试题 1.1类型系统和类型安全 类型系统 类型系统是一门编程语言最核心也是最基础的部分。一门计算机语言无论基于何种编程范式,都必须首先对类型系统做出明确的定义。 数据类型:一个

    2024年02月09日
    浏览(40)
  • 关于C或C++,数组的强制类型转换,uint8_t与char的区别,uint8_t*与char*的兼容性问题以及一些指针的常见问题

    1.类型定义: uint8_t:这是一个无符号 8 位整数类型,定义在 stdint.h 或 inttypes.h 头文件中。它是标准的固定宽度整数类型之一,确保在所有平台上占用 8 位(1 字节)。 char:这是 C 语言的基本字符存储类型,用于存储单个字符。在不同的系统和编译器中,char 可以是有符号的

    2024年01月24日
    浏览(38)
  • 【C++ 进阶】第 1 章:[C 语言基础] C 语言概述与数据类型

    目录 一、C 语言的概述  (1)计算机结构组成 (2)计算机系统组成  (3)ASCII 码 (4)计算机中的数制及其转换 (5)程序与指令  (6)语言的层次划分 (7)主流语言进化史 (8)IDE - VisualStudio 2022 简介 (9)C 语言是面向过程的编程语言 (10)思维导图 (11)详细知识汇

    2024年02月15日
    浏览(42)
  • Linux C语言开发(二)C语言数据类型

    目录 一.C语言概述 1.1 什么是C语言 1.2 C语言与Linux 1.3 C语言的特点 二.数据类型

    2024年01月17日
    浏览(40)
  • C++ 语言类 (class) 和抽象数据类型 (abstract data type)

    在 C++ 语言中,我们使用类定义自己的数据类型。通过定义新的类型来反映待解决问题中的各种概念,从而使得程序更加简洁旦易于修改。数据抽象能帮助我们将对象的具体实现与对象所能执行的操作分离开来。 类的两项基本能力:一是数据抽象,即定义数据成员和函数成员

    2023年04月10日
    浏览(33)
  • JavaScript 类型判断及类型转换规则

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区 📙 专栏地址,欢迎订阅:前端架构师之路 JavaScript 具有七种内置数据类型,它们分别是: null undefined boolean number string object symbol 其中,前面五种为基本类

    2024年01月19日
    浏览(40)
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型,重点是值类型,包括布尔类型、整型、地址类型、字节类型、字符串类型和枚举类型。并且通过两个智能合约例子,用于演示这些数据类型的声明与使用方法。 访问 Github 仓库 获取更多资料。 Solidity中关于数据类型的定义如下: Solidity是

    2024年02月02日
    浏览(69)
  • 从C语言到C++_37(特殊类设计和C++类型转换)单例模式

    目录 1. 特殊类设计 1.1 不能被拷贝的类 1.2 只能在堆上创建的类 1.3 只能在栈上创建的类 1.4 不能被继承的类 1.5 只能创建一个对象的类(单例模式)(重点) 1.5.1 饿汉模式 1.5.2 懒汉模式 2. 类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3. RTTI(了解)和类型转换常见面

    2024年02月10日
    浏览(50)
  • 基本数据类型转换(基本数据类型之间的运算规则)

    前提:这里讨论只是7种基本数据类型变量间的运算。不包含boolean类型的。   自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为: 有多种类型的数据混合运算时,系统首先自动将所有数据 转换成容量最大的那种数据类型,然后再进行计

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包