继承的概念和意义

继承的概念和意义

1、思考

类之间是否存在直接的关联关系

2、生活中的例子

2.1、组合关系:整体与部分的关系

image-20220104213550980

//43-1.cpp
#include <iostream>
#include <string>

using namespace std;

class Memory
{
public:
    Memory()
    {
        cout << "Memory()" << endl;
    }
    ~Memory()
    {
        cout << "~Memory()" << endl;
    }
};

class Disk
{
public:
    Disk()
    {
        cout << "Disk()" << endl;
    }
    ~Disk()
    {
        cout << "~Disk()" << endl;
    }   
};

class CPU
{
public:
    CPU()
    {
        cout << "CPU()" << endl;
    }
    ~CPU()
    {
        cout << "~CPU()" << endl;
    }    
};

class MainBoard
{
public:
    MainBoard()
    {
        cout << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }    
};

class Computer
{
    Memory mMem;
    Disk mDisk;
    CPU mCPU;
    MainBoard mMainBoard;
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    void power()
    {
        cout << "power()" << endl;
    }
    void reset()
    {
        cout << "reset()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
};

int main()
{   
    Computer c;
    
    return 0;
}

组合关系特点

  • 其他类的对象作为当前类的成员使用
  • 当前类的对象与成员对象的生命周期相同
  • 成员对象在用法上与普通对象完全一致

2.2、继承关系:父子关系

image-20220104214449646

面向对象中的继承指类之间的父子关系

  • 子类拥有父类的所有属性和行为
  • 子类就是一种特殊的父类
  • 子类对象可以当做父类对象使用
  • 子类中可以添加父类没有的方法和属性

3、惊艳的继承

c++中通过下面的方式描述继承关系

class Parent
{
    int mv;
public:
    void method();
};

class child : public Parent
{
    
};
//43-2.cpp
#include <iostream>
#include <string>

using namespace std;

class Parent
{
    int mv;
public:
    Parent()
    {
        cout << "Parent()" << endl;
        mv = 100;
    }
    void method()
    {
        cout << "mv = " << mv << endl;
    }
};

class Child : public Parent
{
public:
    void hello()
    {
        cout << "I'm Child." << endl;
    }
};

int main()
{   
    Child c;

    c.hello();
    c.method();

    return 0;
}

重要规则:

  • 子类就是一个特殊的父类
  • 子类对象可以直接初始化父类对象
  • 子类对象可以直接赋值给谷类对象

4、继承的意义

继承是C++中代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写已有功能,或者添加新功能

//43-3.cpp
#include <iostream>
#include <string>

using namespace std;

class Memory
{
public:
    Memory()
    {
        cout << "Memory()" << endl;
    }
    ~Memory()
    {
        cout << "~Memory()" << endl;
    }
};

class Disk
{
public:
    Disk()
    {
        cout << "Disk()" << endl;
    }
    ~Disk()
    {
        cout << "~Disk()" << endl;
    }   
};

class CPU
{
public:
    CPU()
    {
        cout << "CPU()" << endl;
    }
    ~CPU()
    {
        cout << "~CPU()" << endl;
    }    
};

class MainBoard
{
public:
    MainBoard()
    {
        cout << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }    
};

class Computer
{
    Memory mMem;
    Disk mDisk;
    CPU mCPU;
    MainBoard mMainBoard;
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    void power()
    {
        cout << "power()" << endl;
    }
    void reset()
    {
        cout << "reset()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
};

class HPBook : public Computer
{
    string mOS;
public:
    HPBook()
    {
        mOS = "windows 8";
    }
    void install(string os)
    {
        mOS = os;
    }
    void OS()
    {
        cout << mOS << endl;
    }
};

class MacBook : public Computer
{
public:
    void OS()
    {
        cout << "Mac OS" << endl;
    }
};


int main()
{   
    HPBook hp;
    hp.power();
    hp.install("Ubuntu 16.04 LTS");
    hp.OS();

    cout << endl;
    
    MacBook mac;
    mac.OS();
    
    return 0;
}

小结

  • 继承是面向对象中类之间的一种关系
  • 子类拥有父类的所有属性和行为
  • 子类 对象可以当做父类对象使用
  • 子类中可以添加父类没有的方法和属性
  • 继承是面向对象中代码复用的重要手段
<think>嗯,用户问的是C++继承意义。首先,我得回忆一下继承的基本概念。继承是面向对象编程的三大特性之一,另外两个是封装多态。那它的意义是什么呢?应该从代码复用、层次化结构、多态支持这些方面来考虑。 首先,代码复用。继承允许派生类继承基类的成员变量函数,这样就不用重复写相同的代码了。比如多个类有共同的属性方法,可以抽象出一个基类,然后子类继承,避免重复。比如动物类作为基类,狗继承,共享eat()sleep()方法。 然后是层次化结构,也就是分类管理。通过继承可以建立类之间的层次关系,更符合现实世界的逻辑。比如交通工具作为基类,派生出汽车、飞机,再进一步细分。这样的结构更清晰,易于理解维护。 接下来是多态的支持。多态依赖于继承,只有存在继承关系,才能通过虚函数实现运行时多态。比如基类指针指向子类对象,调用虚函数时执行子类的实现。这是设计灵活系统的重要部分。 还有扩展性。继承允许在现有类的基础上添加新功能,或者覆盖部分方法,而不需要修改原来的基类。这符合开放-封闭原则,对扩展开放,对修改关闭。比如在基类的基础上增加新的特性,派生类可以轻松扩展。 可能还要提到接口的统一。通过继承,不同的子类可以有统一的接口,便于统一管理。比如所有图形类都有draw()方法,尽管实现不同,但调用方式一致。 然后需要举例子。比如基类Animal,子类DogCat。Animal有虚函数makeSound(),子类重写这个方法。这样用Animal指针指向不同的子类对象时,调用的是各自的方法,实现多态。 不过要注意,继承也有缺点,比如过度使用会导致层次复杂,或者紧耦合。这时候可能需要组合代替继承。但用户问的是意义,所以重点在优点。 用户可能的疑问点包括继承与组合的区别,什么时候用继承,什么时候用组合。或者多重继承的问题,比如菱形继承。不过问题只问意义,所以可能不需要深入这些,但后续问题可以提相关。 总结一下,回答应该包括代码复用、层次结构、多态支持、扩展性,以及接口统一这几个方面,然后给出例子说明。最后的相关问题应该围绕继承的其他方面,比如类型、访问控制、虚函数作用、多重继承的问题等。</think><< C++继承的核心意义在于实现代码复用、建立类层次结构、支持多态性以及扩展已有类的功能。以下是具体分析: 1. **代码复用** 继承允许派生类直接使用基类的成员(变量函数),避免重复编写相同逻辑。 示例: ```cpp class Animal { public: void breathe() { cout << "Breathing..." << endl; } }; class Dog : public Animal { public: void bark() { cout << "Woof!" << endl; } }; // Dog 类自动拥有 breathe() 方法 ``` 2. **层次化建模** 通过继承表达现实世界的分类关系(如"动物→哺乳动物→狗"),使代码结构更符合逻辑认知。 3. **多态支持** 继承是运行时多态的基础,结合虚函数实现动态绑定: ```cpp class Shape { public: virtual void draw() { cout << "Drawing shape" << endl; } }; class Circle : public Shape { public: void draw() override { cout << "Drawing circle" << endl; } }; // 通过基类指针调用派生类实现 Shape* s = new Circle(); s->draw(); // 输出 "Drawing circle" ``` 4. **功能扩展** 派生类可以: - 添加新成员(横向扩展) - 重写虚函数(纵向扩展) - 通过 `protected` 访问权限修改基类内部实现 5. **接口标准化** 抽象基类定义统一接口,强制派生类实现特定规范: ```cpp class Database { public: virtual void connect() = 0; virtual void query(string) = 0; }; class MySQL : public Database { public: void connect() override { /* MySQL 连接实现 */ } void query(string) override { /* MySQL 查询实现 */ } }; ``` **继承的代价**: - 可能增加类间耦合度 - 深度继承链会影响代码可维护性 - 需要谨慎处理资源管理(通过虚析构函数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值