Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】继承 ⑥ ( 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

【C++】继承 ⑥ ( 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

作者头像
韩曙亮
发布于 2024-05-24 00:48:31
发布于 2024-05-24 00:48:31
63800
代码可运行
举报
运行总次数:0
代码可运行

一、public 公有继承 - 示例分析


1、类型兼容性原则

类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ;

子类代替父类 : 需要 基类 ( 父类 ) 对象的 地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ;

功能完整性 : " 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ;

特别注意 : " 保护继承 " 和 " 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ;

2、类型兼容性原则应用场景

" 类型兼容性原则 " 应用场景 :

  • 直接使用 : 使用 子类对象 作为 父类对象 使用 ;
  • 赋值 : 将 子类对象 赋值给 父类对象 ;
  • 初始化 : 使用 子类对象 为 父类对象 初始化 ;
  • 指针 : 父类指针 指向 子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ;
  • 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型的引用 ;

二、类型兼容性原则 - 示例分析


定义父类 Parent , 子类 Child ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Parent {
public:
    void funParent()
    {
        cout << "父类 funParent 函数" << endl;
    }

private:
    int c;
};

// 子类 公有继承 父类
class Child : public Parent {
public:
    void funChild() 
    {
        cout << "子类 funChild 函数" << endl;
    }
};

1、父类指针 指向 子类对象

定义 一个子类对象 Child child ;

定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 父类对象
    Parent parent;
    // 子类对象
    Child child;

    // I. 类型兼容性原则 : 父类指针 指向 子类对象
    Parent* p_parent2 = NULL;
    p_parent2 = &child;

该原则的应用场景如下 : 定义函数 , 接收 父类指针 或 父类引用 , 此处可以直接传入 子类指针 或 子类引用 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 函数接收父类指针类型
// 此处可以传入子类对象的指针
void fun_pointer(Parent* obj)
{
    obj->funParent();
}

// 函数接收父类引用类型
// 此处可以传入子类对象的引用
void fun_reference(Parent& obj)
{
    obj.funParent();
}

2、使用 子类对象 为 父类对象 进行初始化

定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // II. 类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化
    Parent parent = child;

3、完整代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "iostream"
using namespace std;

class Parent {
public:
    void funParent()
    {
        cout << "父类 funParent 函数" << endl;
    }

private:
    int c;
};

// 子类 公有继承 父类
class Child : public Parent {
public:
    void funChild() 
    {
        cout << "子类 funChild 函数" << endl;
    }
};

// 函数接收父类指针类型
// 此处可以传入子类对象的指针
void fun_pointer(Parent* obj)
{
    obj->funParent();
}

// 函数接收父类引用类型
// 此处可以传入子类对象的引用
void fun_reference(Parent& obj)
{
    obj.funParent();
}

int main() {

    // 父类对象
    Parent parent;
    // 子类对象
    Child child;


    // 父类对象 可以调用 父类公有函数
    parent.funParent();
    // 子类对象 可以调用 子类自身公有函数
    child.funChild();
    // 子类对象 可以调用 父类公有函数
    child.funParent();

    // 将指向子类对象的指针传给接收父类指针的函数
    // 也是可以的
    fun_pointer(&child);

    // 接收父类引用 , 此处传入子类引用
    fun_reference(child);


    // 赋值兼容性原则 : 
    cout << "\n赋值兼容性原则示例 : \n" << endl;


    // 常规操作 : 父类指针 指向 父类对象
    Parent* p_parent = NULL;
    p_parent = &parent;
    // 通过父类指针调用父类函数
    p_parent->funParent();

    // 将指向子类对象的指针传给接收父类指针的函数
    // 也是可以的
    fun_pointer(p_parent);

    // 接收父类引用参数
    fun_reference(*p_parent);


    // I. 类型兼容性原则 : 父类指针 指向 子类对象
    Parent* p_parent2 = NULL;
    p_parent2 = &child;
    // 通过父类指针调用父类函数
    p_parent2->funParent();


    // II. 类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化
    Parent parent3 = child;
    
    

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
父类 funParent 函数
子类 funChild 函数
父类 funParent 函数
父类 funParent 函数
父类 funParent 函数

赋值兼容性原则示例 :

父类 funParent 函数
父类 funParent 函数
父类 funParent 函数
父类 funParent 函数
Press any key to continue . . .
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++类间的 “接力棒“ 传递:继承(上)
共同点就相当于一个基底,称他为基类或者父类,在基类的基础上拓展出来的各种各样的角色称他为派生类或者子类,这样一个拓展的过程就叫继承,所以继承的本质是一种复用
DARLING Zero two
2025/04/04
820
C++类间的 “接力棒“ 传递:继承(上)
【C++课程学习】:继承(上)(详细讲解)
继承是面向对象程序设计使代码可以复用的重要手段,它允许在原有类的基础上进行拓展,增加功能,形成新的类。
用户11396661
2024/12/09
1280
【C++课程学习】:继承(上)(详细讲解)
【C++】多态 ① ( 类型兼容性原则与函数重写 | “ 多态 “ 引入 | 函数重写 )
在面向对象中 , " 多态 " 是 设计模式 的基础 , 是 软件框架 的基础 ;
韩曙亮
2023/10/28
2830
【C++】多态 ① ( 类型兼容性原则与函数重写 | “ 多态 “ 引入 | 函数重写 )
C++继承
(2)基类的私有成员无论是是使用何种方式继承,在派生类里面和外面都是不可以进行访问的;但是如果像这个基类的公有成员被私有继承,这个时候基类的公有成员在派生类里面就是私有的,这个私有的成员在派生类里面是可以进行访问的,但是在派生类的外面是不可以进行访问的;
阑梦清川
2025/02/24
1080
C++继承
【C++】详细讲解继承(上)
假如现在我们模拟校园环境,设计老师(Teacher)和学生(Student)两个类。老师和学生都有姓名、电话、地址、年龄等成员变量,都有身份认证相关成员函数。
羚羊角
2025/01/24
600
【C++】详细讲解继承(上)
从父类到子类:C++ 继承的奇妙旅程(1)
        在前文,小编讲述了C++模板的进阶内容,下面我们就要结束C++初阶的旅行,开始进入C++进阶容的旅c程,今天旅程的第一站就是C++三大特性之一——继承的旅程,各位扶好扶手,开始我们今天的C++继承的奇妙旅程。
用户11295429
2025/05/09
910
从父类到子类:C++ 继承的奇妙旅程(1)
【C++深度探索】:继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数)
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或子类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
IsLand1314
2024/10/15
2020
【C++深度探索】:继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数)
【C++】类和对象之继承
简单来说就是类似于在一个类中包含了另一个类的成员函数和成员变量以及对应的访问权限。
啊QQQQQ
2024/11/19
1150
【C++】类和对象之继承
【C++】多态 ② ( 面向对象中 “ 多态 “ 的真正需求 | 面向对象 “ 多态 “ 实现 - virtual 修饰函数 | 代码示例 )
在上一篇博客 【C++】多态 ① ( 类型兼容性原则与函数重写 | “ 多态 “ 引入 | 函数重写 ) 中 , 进行了测试 , 在测试代码中 , 实际的对象类型是 Parent 父类类型的 ,
韩曙亮
2023/10/28
2020
【C++】多态 ② ( 面向对象中 “ 多态 “ 的真正需求 | 面向对象 “ 多态 “ 实现 - virtual 修饰函数 | 代码示例 )
C++进阶:详细讲解继承
现在也是结束了初阶部分的内容,今天开始就进入进阶部分了。一刻也没有为初阶的结束而哀悼,立刻赶来“战场”的是进阶部分里的继承
是Nero哦
2024/03/11
1860
C++进阶:详细讲解继承
【C++】继承 - 从基类到派生类的代码复用逻辑
 继承机制是面向对象程序设计使代码可以复用的手段,它允许我们在保持原有类基础上面拓展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。  下面是没有继承之前实现的两个类,一个是student一个是teacher,它们两个都有姓名,年龄,电话,地址相同的变量,都有identity身份认证的成员函数,设计到两个类里面就是冗余的。它们也有不同的成员函数和变量,比如老师独有的成员变量是职称,学生独有的成员变量是学号。学生独有的成员函数是学习,老师独有的成员函数是授课。
_孙同学
2025/04/14
2010
【C++】继承 - 从基类到派生类的代码复用逻辑
【C++】你不得不爱的——继承
 凡是面向对象的语言,都有三大特性,继承,封装和多态,但并不是只有这三个特性,是因为者三个特性是最重要的特性,那今天我们一起来看继承!
The sky
2023/04/12
4130
【C++】你不得不爱的——继承
C++继承(多继承、菱形继承?)
继承(inheritance)机制是面向对象程序设计,使代码可以复用的最重要的手段。它允许程序员在保持原有类特性的基础上进行扩展,以增加功能。这样产生新的类,称为派生类。
利刃大大
2023/04/12
2.1K0
C++继承(多继承、菱形继承?)
复杂的C++继承
继承这个词对我们来说应该不陌生,在现实生活中,你作为你父亲的继承者之一可以获得你父亲的财产,直接少奋斗N年。这里的继承也差不多是这个意思:在一个程序中有很多不同的类,但是这些类可能有共同的属性(成员变量或成员方法),为了避免多次对同样的成员方法和成员变量声明,C++就提出了继承。继承是类设计层次的代码复用。被继承的类就是父类或者基类,继承的类叫做子类或者派生类。
始终学不会
2023/10/17
3340
复杂的C++继承
探索C/C++的奥秘之C++中的继承
继承的好处是可以复用,通俗点来讲就是父辈打下的江山或者是基业我们可以继续使用。继承是类设计层次的复用。
用户11290648
2025/01/13
1690
探索C/C++的奥秘之C++中的继承
c++进阶(c++里的继承)
继承机制是面向对象程序设计使代码可以复用的重要手段,它允许程序员再保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用
Yui_
2024/10/15
1170
c++进阶(c++里的继承)
c++父类指针指向子类对象
父类子类指针函数调用注意事项 1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数(静态联翩) 2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会给程序员带来困扰。(一般不会这么去定义) 3,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。
zhangjiqun
2024/12/16
2140
【C++深度探索】继承机制详解(一)
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类或子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
大耳朵土土垚
2024/07/01
1280
【C++深度探索】继承机制详解(一)
C++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
二肥是只大懒蓝猫
2023/03/30
1.1K0
C++中的继承
【c++】C++中的继承&&菱形继承详解
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用
用户10925563
2024/06/04
2280
【c++】C++中的继承&&菱形继承详解
相关推荐
C++类间的 “接力棒“ 传递:继承(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验