C++--继承的概念和意义、继承中的访问级别、不同的继承方式

一.继承的概念和意义

Q:类之间是否存在直接的关联关系?
由这个问题由此联想到生活中的例子:组合
A.组合关系:整体与部分的关系

组合关系的描述--代码示例

#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;
}

从该段代码可以看出,电脑的每一个部分都是独立的,但是在创建电脑的类时对每个部分进行了调用,期待的输出是其它类的对象作为电脑类的成员使用
结果输出如下

组合关系的特点
1.将其它类的对象作为当前类的成员使用
2.当前类的对象与成员对象的生命周期相同
3.成员对象在用法上与普通对象完全一致

B.继承关系:父子关系

面向对象中的继承指类之间的父子关系
1.子类拥有父类的所有属性和行为
2.子类就是一种特殊的父类
3.子类对象可以当作父类对象使用
4.子类中可以添加父类没有的方法和属性
继承关系的代码描述

#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;
}

运行结果

由运行的结果可以发现在子类中没有定义 成员函数void method(),但是输出的结果中却有mv的值,这是因为继承关系的优点--子类拥有父类的所有属性和行为
同时须知道--子类就是一个特殊的父类,子类对象可以直接初始化父类对象,子类对象可以直接赋值给父类对象
继承的意义--继承是C++中代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写已有功能,或者添加新功能

二.继承中的访问级别

Q:子类是否可以直接访问父类的私有成员?

代码验证


#include <iostream>
#include <string>

using namespace std;

class Parent
{
private:
    int mv;
public:
    Parent()
    {
        mv = 100;
    }

    int value()
    {
        return mv;
    }
};

class Child : public Parent
{
public:
    int addValue(int v)
    {
        mv = mv + v;
    }
};

int main()
{
    return 0;
}

根据上面的继承关系--子类拥有父类的所有属性和行为,我们可以期待在子类的 int addValue(int v)的成员函数中对父类的私有成员变量mv进行改动
运行结果

从运行的结果我们可以得知,子类的int addValue(int v)成员函数出错,提示mv是父类私有成员变量,不能对其进行访问,这与我们期待的结果不一样,所以在子类对父类的修饰的私有成员进行访问有了一种新的访问级别--protected
继承中的访问级别
1.面向对象中的访问级别不只是public和private
2.可以定义protected访问级别
3.关键字protected的意义--修饰的成员不能被外界直接访问,修饰的成员可以被子类直接访问
代码示例--protected的运用

#include <iostream>
#include <string>

using namespace std;

class Parent
{
protected:
    int mv;
public:
    Parent()
    {
        mv = 100;
    }

    int value()
    {
        return mv;
    }
};

class Child : public Parent
{
public:
    int addValue(int v)
    {
        mv = mv + v;
    }
};

int main()
{
    Parent p;

    cout << "p.mv = " << p.value() << endl;

    // p.mv = 1000;    // error

    Child c;

    cout << "c.mv = " << c.value() << endl;

    c.addValue(50);

    cout << "c.mv = " << c.value() << endl;

    // c.mv = 10000;  // error

    return 0;
}

运行结果

但是当我们在int main中对mv进行修改时得到的运行结果

可以看到在子类的外部不允许对父类的私有成员变量进行修改
由以上的两个实例我们可以一张图片来完全表示继承关系

小结
1.面向对象的访问级不只是public和private
2.protected修饰的成员不能被外界所访问
3.protected使得子类能够访问父类的成员
4.protected关键字是为了继承而专门设计的
5.没有protected就无法完成真正意义上的代码复用

三.C++中支持三种不同的继承方式
1.public继承--父类成员在子类中保持原有访问级别
2.private继承--父类成员在子类中变私有成员
3.protected继承--父类中的公有成员变为保护成员,其它成员保持不变

原文地址:https://blog.51cto.com/13475106/2415091

时间: 2024-08-09 18:39:25

C++--继承的概念和意义、继承中的访问级别、不同的继承方式的相关文章

第43课 继承的概念及意义

1. 类之间的组合关系 (1)组合关系:整体与部分的关系 [实例分析]组合关系的描述 #include <iostream> using namespace std; //内存类 class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory() { cout << "~Memory()" << endl; } }; //硬盘类

第43课 继承的概念和意义

面向对象的高端课程都是和继承相关的,例如设计模式. 思考: 类与类之间是否存在直接的关联关系? 生活中的例子: 组合关系的程序描述: 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Memory 7 { 8 public: 9 Memory() 10 { 11 cout << "Memory()" << endl; 12 } 13 ~

继承的概念和意义

类和类之间的关联关系 组合关系:整体与部分的关系 继承关系(父子关系) 组合关系的特点 将其它类的对象作为类的成员使用 当前类的对象与成员对象的生命期相同 成员对象在用法上与普通对象完全一致 面向对象中的继承指类之间的父子关系 子类拥有父类的所有属性和行为 子类就是一种特殊的父类 子类对象可以当作父类对象使用 子类中可以添加父类没有的方法和属性 C++中通过下面的方式描述继承关系 1 class Parent 2 { 3 int mv; 4 public: 5 void method(); 6

C++--模板的概念和意义、深入理解函数模板、类模板的概念和意义

一.模板的概念与意义 Q:C++中有几种交换变量的方法?定义宏代码与定义函数A.定义宏代码优点:代码复用,适合所有的类型缺点:编译器不知道宏的存在,缺少类型检查B.定义函数优点:真正的函数调用,编译器对类型进行检查缺点:根据类型重复定义函数,无法代码复用 C.泛型编程--不考虑具体数据类型的编程方式Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型C++中的泛型编程函数模板--一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化函数模板的语法规则1.

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

继承中的访问级别(三十七)

我们在上篇博客中介绍了 C++ 中的继承,那么我们想想既然是继承了,子类是否可以直接访问父类中的私有成员呢?根据面向对象理论:子类拥有父类的一切属性和行为,自然子类也就能直接访问父类的私有成员!但是根据 C++ 语法:外界不能直接访问类的 private 成员,因此子类就不能直接访问父类的私有成员!那么到底哪种是正确的呢?我们来编程实验下 #include <iostream> #include <string> using namespace std; class Parent

Java基础:1、继承的概念和继承的特点

一.基础概念介绍 1.继承是什么?   众所周知,继承是面向对象的三大特征之一.具体将继承理解为两个类之间的关系,被继承的类称为父类,进行父类操作的类叫做子类.子类是对于父类的扩展,通过继承可以使得子类访问父类的非私有成员变量以及成员方法,还可以在子类中对父类中原有的方法进行覆盖重写. 2.继承带来了什么好处?  存在必有意义.使用继承可以增强代码的复用性,提高了代码的可维护性,以及使扩展旧代码的操作风险降得更低.如果你接手了一个陈年老旧的系统,发现其中代码漏洞百出,这时又不轻举妄动,那么选择继

c# 中面相对性的三个特点:封装,继承,多态, 以及c#中隐藏(new)和方法重写(override)和重载(overload)的区别

封装 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3) 访问修饰符 声明的可访问性                                 含义 public                                    访问不受限制. protected                              访问仅限于本类或者其子类(可以跨程序集). p

第44课 继承中的访问级别

1. 值得思考的问题 (1)根据面向对象的理论:子类拥有父类的一切属性和行为,子类能够直接访问父类的私有成员! (2)但C++语法规定,外界不能直接访问类的private成员,所以子类也不能直接访问父类的私有成员! 2. 继承中的访问级别 (1)面向对象中的访问级别不只是public和private (2)可以定义protected访问级别 (3)关键字protected的意义 ①修饰的成员不能被外界直接访问 ②修饰的成员可以被子类直接访问 [编程实验]组合和继承的综合实例 #include <