详解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++类型兼容性规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt控件之QToolButton的使用及示例

    Qt控件之QToolButton的使用及示例

    QToolButton类提供了一个快速访问命令或选项的按钮,通常在QToolBar内部使用,本文主要介绍了Qt控件之QToolButton的使用及示例,感兴趣的可以了解一下
    2023-10-10
  • C语言SQLite3事务和锁的操作实例

    C语言SQLite3事务和锁的操作实例

    这篇文章主要介绍了C语言SQLite3事务和锁的操作,结合完整实例形式分析了C语言针对SQLite3数据库的事务与锁相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • Qt实现字幕无间隙滚动效果

    Qt实现字幕无间隙滚动效果

    这篇文章主要为大家详细介绍了如何利用Qt实现字幕无间隙滚动效果,文中的实现过程讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • 教你用c++从头开始实现决策树

    教你用c++从头开始实现决策树

    从头实现一个分类决策树分类器似乎是一个适当的挑战。这已经被证明是一个测试但有益的学习旅程,我想分享一些我在这个过程中的主要经验,对c++实现决策树相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • C语言多种方法实现一个函数左旋字符串中K个字符

    C语言多种方法实现一个函数左旋字符串中K个字符

    这篇文章主要为大家介绍了C语言多种方法实现一个函数,可以左旋字符串中K个字符,文中附含详细的示例讲解,有需要的朋友可以借鉴参考下
    2021-10-10
  • C语言结构体计算内存占用问题解析

    C语言结构体计算内存占用问题解析

    这篇文章主要介绍了C语言结构体计算内存占用问题解析,本文通过案例来解析了C语言计算结构体内存的方式和方法,需要的朋友可以参考下
    2021-07-07
  • Visual Studio 2019配置OpenCV4.1.1详细图解教程

    Visual Studio 2019配置OpenCV4.1.1详细图解教程

    这篇文章主要介绍了Visual Studio 2019配置OpenCV4.1.1详细图解教程 ,需要的朋友可以参考下
    2020-02-02
  • vc控制台程序关闭事件时的处理方式及注意点详解

    vc控制台程序关闭事件时的处理方式及注意点详解

    在本篇文章里小编给大家整理的是一篇关于vc控制台程序关闭事件时的正确处理方式的相关知识点内容,对此有需求的朋友们可以参阅下。
    2021-12-12
  • C语言中栈的两种实现方法

    C语言中栈的两种实现方法

    栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组,这篇文章主要介绍了C语言中栈的两种实现方法,需要的朋友可以参考下
    2021-08-08
  • C++多线程之unique_lock的使用详解

    C++多线程之unique_lock的使用详解

    本文主要介绍了C++多线程之unique_lock的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04

最新评论