【C++基础入门】38.C++中继承中的访问级别

文章目录

一、值得思考的问题

二、继承中的访问级别

三、定义类时访问级别的选择

四、组合与继承的综合实例

五、小结


一、值得思考的问题

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

  • 思考过程

        下面来看一个继承中的访问级别:

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

        输出结果如下,可以看到子类并不能直接访问父类的私有成员

二、继承中的访问级别

  • 面向对象中的访问级别不只是 publicprivate
  • 可以定义 protected 访问级别
  • 关键字 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;
}

        输出结果如下,注意 p.mv = 1000; 和 c.mv = 10000; 都会报错,因为 protected 修饰的成员不能被外界直接访问,但是 c.addvalue(50); 不会报错,这是因为 protected 修饰的成员可以被子类直接访问

三、定义类时访问级别的选择

        思考:为什么面向对象中需要 protected ?

        公开的信息用 public,隐私的信息,不想被外界知道,用 private, 有的东西可以让一部分人知道,这个时候就得用 protected

四、组合与继承的综合实例

        Point 和 Line 都继承于 Object 这个类,Line 这个类需要组合两个 point 类,因为两点确定一条直线。

        下面来进行实现:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

class Object
{
protected:
    string mName;
    string mInfo;
public:
    Object()
    {
        mName = "Object";
        mInfo = "";
    }
    string name()
    {
        return mName;
    }
    string info()
    {
        return mInfo;
    }
};

class Point : public Object
{
private:
    int mX;
    int mY;
public:
    Point(int x = 0, int y = 0)
    {
        ostringstream s;
        
        mX = x;
        mY = y;
        mName = "Point";
        
        s << "P(" << mX << ", " << mY << ")";
        
        mInfo = s.str();
    }
    int x()
    {
        return mX;
    }
    int y()
    {
        return mY;
    }
};

class Line : public Object
{
private:
    Point mP1;
    Point mP2;
public:
    Line(Point p1, Point p2)
    {
        ostringstream s;
        
        mP1 = p1;
        mP2 = p2;
        mName = "Line";
        
        s << "Line from " << mP1.info() << " to " << mP2.info();
        
        mInfo = s.str();
    }
    Point begin()
    {
        return mP1;
    }
    Point end()
    {
        return mP2;
    }
};

int main()
{   
    Object o;
    Point p(1, 2);
    Point pn(5, 6);
    Line l(p, pn);
    
    cout << o.name() << endl;
    cout << o.info() << endl;
    
    cout << endl;
    
    cout << p.name() << endl;
    cout << p.info() << endl;
    
    cout << endl;
    
    cout << l.name() << endl;
    cout << l.info() << endl;
    
    return 0;
}

         输出结果如下:

五、小结

  • 面向对象中的访问级别不只是 public private
  • protected 修饰的成员不能被外界所访问
  • protected 使得子类能够访问父类的成员
  • protected 关键字是为了继承而专门设计的
  • 没有 protected 就无法完成真正意义上的代码复用
     
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
《Visual C++ 2005入门经典》是一本非常经典的书籍,它是针对初学者编写的,旨在教授使用Visual C++ 2005进行程序开发的基本知识和技能。 本书首先介绍了Visual C++ 2005的各种特性和功能,包括IDE的使用、工程创建与管理、界面设计、调试和发布等方面。接着,书详细讲解了C++语言基础知识,如语法、数据类型、运算符、控制语句等,以帮助读者建立起扎实的编程基础。 随后,作者深入讲解了面向对象的编程概念和技巧,如类、对象、继承、多态等,以及在Visual C++ 2005如何利用这些概念来编写高效、可维护的程序。 此外,本书还介绍了常用的GUI编程技术,包括Windows窗口的创建与管理、控件的使用、消息处理、事件响应等,读者可以通过学习这些内容掌握如何开发出具有丰富用户界面和交互能力的应用程序。 最后,本书还介绍了一些高级主题,如内存管理、异常处理、文件操作等,以及一些开发好习惯和技巧,如代码调试与优化、错误处理等,旨在帮助读者写出高质量、稳定可靠的程序。 总之,《Visual C++ 2005入门经典》是一本很好的学习资料,它以浅显易懂的方式、丰富的示例代码和实践项目,帮助读者逐步掌握Visual C++ 2005的开发技术,并能够独立开发出基于Visual C++的应用程序。无论是初学者还是有一定编程经验的人都可以从获益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风自在 流水潺潺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值