详解C++类型兼容性规则

 更新时间:2025年10月10日 09:20:00   作者:吴e凡  
本文主要介绍了详解C++类型兼容性规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:

  1. 派生类的对象可以被赋值给基类对象。
  2. 派生类的对象可以初始化基类的引用。
  3. 指向基类的指针也可以指向派生类。

通过基类对象名、指针只能使用从基类继承的成员

举例:

1.派生类的对象可以被赋值给基类对象。这是一个总纲领,意味着在需要基类对象的地方,我们都可以用一个派生类对象来替代。

这会导致对象切片

#include <iostream>
#include <string>

// 基类
class Person {
public:
    std::string name;

    void introduce() {
        std::cout << "我是一个人, 我的名字是 " << name << std::endl;
    }
};

// 公有派生类
class Student : public Person {
public:
    int studentID; // 派生类特有的成员

    void study() { // 派生类特有的方法
        std::cout << name << " 正在学习, 学号是 " << studentID << std::endl;
    }
};

int main() {
    Student stu;
    stu.name = "张三";
    stu.studentID = 101;

    Person per;
    per = stu; // 将派生类对象 stu 赋值给 基类对象 per

    std::cout << "基类对象 per 的名字: " << per.name << std::endl;
    per.introduce();

    // per.studentID = 102; // 错误! per 是一个 Person 对象, 它没有 studentID 成员。
    // per.study();         // 错误! per 是一个 Person 对象, 它没有 study() 方法。
}

解释:
当执行 per = stu; 时,stu 对象中从 Person 继承来的部分(也就是 name 成员)被拷贝到了 per 对象中。stu 对象自己独有的成员(studentID)被完全“切掉”和丢弃了。因此,per 仍然是一个纯粹的 Person 对象,它只知道 name,不知道任何关于 studentID 或 study() 的信息。

2.派生类的对象可以初始化基类的引用。这是实现多态的一种非常安全和常见的方式,不会发生对象切片

#include <iostream>
#include <string>

// 基类
class Person {
public:
    std::string name;

    void introduce() {
        std::cout << "我是一个人, 我的名字是 " << name << std::endl;
    }
};

// 公有派生类
class Student : public Person {
public:
    int studentID; // 派生类特有的成员

    void study() { // 派生类特有的方法
        std::cout << name << " 正在学习, 学号是 " << studentID << std::endl;
    }
};

int main() {
    Student stu;
    stu.name = "李四";
    stu.studentID = 102;

    // 使用派生类对象 stu 来初始化一个基类的引用
    Person& per_ref = stu;

    std::cout << "通过基类引用访问名字: " << per_ref.name << std::endl;
    per_ref.introduce(); // 调用的是 Person 的方法

    // per_ref.study(); // 错误! 虽然引用指向的是 Student 对象,但引用本身是 Person 类型,
                       // 只能访问 Person 中定义的成员。
}

解释:
per_ref 是基类 Person 的一个引用,它直接绑定到了 stu 这个派生类对象上。内存中只有一个 stu 对象,没有发生任何拷贝。per_ref 成为了 stu 对象的一个“别名”,但这个别名是 Person 类型的,所以它有一个受限的“视野”。

3.指向基类的指针也可以指向派生类。这是实现多态最核心、最灵活的方式,同样不会发生对象切片

#include <iostream>
#include <string>

// 基类
class Person {
public:
    std::string name;

    void introduce() {
        std::cout << "我是一个人, 我的名字是 " << name << std::endl;
    }
};

// 公有派生类
class Student : public Person {
public:
    int studentID; // 派生类特有的成员

    void study() { // 派生类特有的方法
        std::cout << name << " 正在学习, 学号是 " << studentID << std::endl;
    }
};

int main() {
    Student stu;
    stu.name = "王五";
    stu.studentID = 103;

    // 基类指针指向派生类对象
    Person* per_ptr = &stu;

    std::cout << "通过基类指针访问名字: " << per_ptr->name << std::endl;
    per_ptr->introduce(); // 调用的是 Person 的方法

    // per_ptr->study(); // 错误! 指针类型是 Person*,它“看”不到 Student 类中新增的成员。
}

解释:
`per_ptr` 是一个 `Person` 类型的指针,它存储了 `stu` 对象的内存地址。和引用一样,它也只是提供了一个基类“视角”来观察这个派生类对象。

到此这篇关于详解C++类型兼容性规则的文章就介绍到这了,更多相关C++类型兼容性规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详情介绍C++之命名空间

    详情介绍C++之命名空间

    这篇文章主要详情介绍了C++命名空间,命名空间的出现就是为了解决名称冲突问题,对此感兴趣的朋友可以参考下面文章
    2021-09-09
  • 基于C++编写一个进度条的示例代码

    基于C++编写一个进度条的示例代码

    这篇文章主要为大家详细介绍了如何利用C++实现一个命令行进度条,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • C++与C语言的区别你知道吗

    C++与C语言的区别你知道吗

    这篇文章主要为大家详细介绍了C++与C的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++印刷模板使用方法详解

    C++印刷模板使用方法详解

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型
    2022-11-11
  • Qt实现网络聊天室的示例代码

    Qt实现网络聊天室的示例代码

    本文主要介绍了Qt实现网络聊天室,实现一个在线聊天室, 使用tcp对客户端和服务器端进行通讯。具有一定的参考价值,具有一定的参考价值,
    2021-06-06
  • opencv提取轮廓大于某个阈值的图像

    opencv提取轮廓大于某个阈值的图像

    这篇文章主要为大家详细介绍了opencv提取轮廓大于某个阈值的图像,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++实现简易UDP网络聊天室

    C++实现简易UDP网络聊天室

    这篇文章主要为大家详细介绍了C++实现简易UDP网络聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++实现LeetCode(209.最短子数组之和)

    C++实现LeetCode(209.最短子数组之和)

    这篇文章主要介绍了C++实现LeetCode(209.最短子数组之和),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 求解旋转数组的最小数字

    求解旋转数组的最小数字

    这篇文章主要介绍了求解旋转数组的最小数字的相关资料,需要的朋友可以参考下
    2017-05-05
  • 浅析C++中的动态内存分配

    浅析C++中的动态内存分配

    这篇文章主要为大家详细介绍了C++中动态内存分配的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论