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

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

#include <iostream>
#include <string>

using namespace std;

class Parent
{
    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;
}

我们来编译下看看是否可以通过

编译报错了,说明我们的第二种分析是正确的。那么不是说继承可以获得父类的全部资源嘛,它的私有成员在子类中就不能被访问。接下来我们就要介绍一个概念了,在面向对象中的访问级别不只是 public 和 private,还有个 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;
    
    Child c;
    
    cout << "c.mv = " << c.value() << endl;
    
    c.addValue(50);
    
    cout << "c.mv = " << c.value() << endl;
    
    return 0;
}

我们来试下将 private 属性换成 protected,看看编译可以通过吗?

我们看到编译通过了,也正常运行了。那么我们在 main 函数中直接给 p.mv 和 c.mv 赋值为 1000 呢?我们看看编译结果

我们看到编译失败了,因为成员变量 mv 是 protected 的,所以在外界不能直接访问。那么为什么在面向对象中需要 protected 呢?我们来想想现实生活中,比如小明要去医院看病。有些隐秘的病史,小明肯定不想让别人知道,但是这时必须得给医生坦白,不然没法治病哈。这时便有了 protected 这个需求了,这个病史不是纯私有的,但又不是暴露在大众之下的。我们面向对象的思想中,为了更完美的贴合生活,便有了 protected 这个关键字。那么我们在定义类时访问级别是怎样选择的呢?我们来看看下面这张表。注:表是由唐长老总结出来的!

关系已经很明确了,我就不多废话了。下来我们来看个示例,关系如下

用程序描述出来就是下面这

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

我们看看编译结果

我们看到在 Object 类中没有相应的描述,所以它的信息为空,别的打印是正确的。通过对继承中的访问级别的学习,总结如下:1、面向对象中的访问级别不只是 public 和 private;2、protected 修饰的成员不能被外界访问,它使得子类能够访问父类的成员;3、protected 关键字是为了继承而专门设计的;4、没有 protected 就无法完成真正意义上的代码复用。

欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。

原文地址:http://blog.51cto.com/12810168/2120653

时间: 2024-10-14 10:17:22

继承中的访问级别(三十七)的相关文章

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

一.继承的概念和意义 Q:类之间是否存在直接的关联关系?由这个问题由此联想到生活中的例子:组合A.组合关系:整体与部分的关系组合关系的描述--代码示例 #include <iostream> #include <string> using namespace std; class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory() { cout <&

第44课 继承中的访问级别

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

第四十四课、继承中的访问级别

一.一个令人疑惑的问题 二.面向对象中的访问级别 1.面向对象中的访问级别不只是public和private 2.可以定义protected的访问级别 3.关键字protected的意义 (1).修饰的成员不能被外界直接访问 (2).修饰的成员可以被子类直接访问 #include <iostream> #include <string> using namespace std; class Parent { protected: int mv; public: Parent() {

第45课 继承中的访问级别

1. C++中3种不同的继承方式 (1)public继承:父类成员在子类中保持原有访问级别 (2)private继承:父类成员在子类中变为私有成员 (3)protected继承:父类中的公有成员变为保护成员,其它成员保持不变. ①继承成员的访问属性 = Max{继承方式, 父类成员访问属性},Max表示最严格 ②C++中的默认继承方式为private [编程实验]继承的访问级别深度实践 #include <iostream> using namespace std; class Parent

ActionScript3游戏中的图像编程(连载三十七)

2.2.10 内阴影选项 最后检查一下有没有漏网之鱼--嗯,Flash里还有个"内阴影"被我们忽略了,勾选以后,投影将形成于在文字内部(为了让阴影效果看得清楚点,我暂时把文本调整为绿色#00CC00)(图 2.40). 图 2.40 Flash的内阴影 内阴影在Photoshop里作为一个独立的选项存在于图层样式的列表中,参数与投影选项基本一致,只是少了"挖空"复选框.(图 2.41) 图 2.41 Photoshop的内阴影选项 两个选项都勾上以后,内外阴影就会同

[原创]ActionScript3游戏中的图像编程(连载三十七)

2.2.10 内阴影选项 最后检查一下有没有漏网之鱼……嗯,Flash里还有个“内阴影”被我们忽略了,勾选以后,投影将形成于在文字内部(为了让阴影效果看得清楚点,我暂时把文本调整为绿色#00CC00)(图 2.40). 图 2.40 Flash的内阴影 内阴影在Photoshop里作为一个独立的选项存在于图层样式的列表中,参数与投影选项基本一致,只是少了“挖空”复选框.(图 2.41) 图 2.41 Photoshop的内阴影选项 两个选项都勾上以后,内外阴影就会同时应用于同一个对象上了,但是F

继承关系中的第三种方式:利用&lt;union-subclass&gt;(补充)

继承关系中的第三种方式:利用<union-subclass>   代码:   映射文件(其他的代码和其他继承关系相同)   Person.hbm.xml   <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/

C++ 类的继承三(继承中的构造与析构)

//继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类的构造函数 3.当父类的构造函数有参数时,需要在子类的初始化列表中显示调用 4.析构函数调用的先后顺序与构造函数相反 继承与其他类做成员变量混搭的情况下,构造和析构嗲用原则 1.先构造父类,在构造成员变量,最后构造自己 2.先析构自己,再析构成员变量,最后析构父类 */ clas

Gradle 1.12用户指南翻译——第三十七章. OSGi 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个