前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】继承 ⑥ ( 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

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

作者头像
韩曙亮
发布2024-05-24 08:48:31
1290
发布2024-05-24 08:48:31
举报

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


1、类型兼容性原则

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

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

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

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

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

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

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

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


定义父类 Parent , 子类 Child ;

代码语言:javascript
复制
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
复制
    // 父类对象
    Parent parent;
    // 子类对象
    Child child;

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

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

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

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

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

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

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

3、完整代码示例

代码语言:javascript
复制
#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
复制
父类 funParent 函数
子类 funChild 函数
父类 funParent 函数
父类 funParent 函数
父类 funParent 函数

赋值兼容性原则示例 :

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、public 公有继承 - 示例分析
    • 1、类型兼容性原则
      • 2、类型兼容性原则应用场景
      • 二、类型兼容性原则 - 示例分析
        • 1、父类指针 指向 子类对象
          • 2、使用 子类对象 为 父类对象 进行初始化
            • 3、完整代码示例
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档