44-继承中的访问级别

来源:互联网 发布:人工智能优势好处 编辑:程序博客网 时间:2024/05/16 09:24

1、疑问

这里写图片描述
不能

2、思考

这里写图片描述

#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;}编译错误,不能访问父类私有成员

3、继承中的访问级别

这里写图片描述

要想实现子类能够访问父类成员变量,可以将私有成员变量改为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 main函数为类的外部,不能够直接访问类内的保护成员    Child c;    cout << "c.mv = " << c.value() << endl;    c.addValue(50);    cout << "c.mv = " << c.value() << endl;    // c.mv = 10000;  // 不能在类的外部直接修改protacted成员    return 0;}

4、思考

这里写图片描述

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

这里写图片描述

6、组合与继承的示例

这里写图片描述

#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;}ObjectPointP(1, 2)LineLine from P(1, 2) to P(5, 6)

7、小结

这里写图片描述

原创粉丝点击