c++ - 不了解私有/受保护的变量。我的实现没有达到我的预期
问题描述
我正在尝试了解继承,以及私有、受保护和公共变量如何工作。
我的理解是,一个类的私有变量只能由该类的成员读取,而受保护的变量可以由该类的成员和派生类读取。
我正在实现一些代码以确保我正确理解这一点,并且我似乎能够访问我不希望能够访问的变量。
我有一个多边形类和一个派生类三角形。我在这些类的公共区域编写了一组 read() 函数来读取它们的变量。这些函数被重载,因此在没有参数的情况下,read() 将返回调用对象的变量,或者,read(&Poly) 可以将另一个多边形作为参数并返回另一个多边形的变量。
#include <iostream>
using namespace std;
class Polygon;
class Triangle;
class Polygon {
private:
int privatePoly = 1;
protected:
int protectedPoly = 10;
public:
int publicPoly = 100;
// Setters
void setPrivate (int x) { privatePoly = x; }
void setProtected (int x) { protectedPoly = x; }
// Read
int readPrivate (const Polygon& inPoly) { return inPoly.privatePoly; }
int readProtected (const Polygon& inPoly) { return inPoly.protectedPoly; }
int readPublic (const Polygon& inPoly) { return inPoly.publicPoly; }
};
class Triangle : public Polygon {
private:
int privateTriangle = 3;
protected:
int protectedTriangle = privateTriangle*10;
public:
int publicTriangle = privateTriangle*100;
// Read Triangle variables
int readPrivate_Tri () { return privateTriangle; }
int readProtected_Tri () { return protectedTriangle; }
int readPublic_Tri () { return publicTriangle; }
int readPrivate_Tri (const Triangle& inTri) { return inTri.privateTriangle; }
int readProtected_Tri (const Triangle& inTri) { return inTri.protectedTriangle; }
int readPublic_Tri (const Triangle& inTri) { return inTri.publicTriangle; }
};
我实例化了每种类型的一个对象,Polygon P1 和 Triangle T1,并尝试从派生类 T1 中读取 P1 的私有变量,因为派生类不应该读取私有变量,因此预计这会失败。它没有。
int main(int argc, const char * argv[]) {
Polygon P1;
Triangle T1;
// To make sure T1's polygon variables are different from P1's.
T1.setPrivate(2);
T1.setProtected(20);
// T1 reading P1
cout << "T1.readPrivate(P1): " << T1.readPrivate(P1) << endl;
cout << "T1.readProtected(P1): " << T1.readProtected(P1) << endl;
cout << "T1.readPublic(P1): " << T1.readPublic(P1) << endl << endl;
return 0;
}
这产生
T1.readPrivate(P1): 1
T1.readProtected(P1): 10
T1.readPublic(P1): 100
我认为这可能与读取函数最初是在父 Polygon 类中声明的事实有关(并且私有/受保护的说明符指的是声明函数的位置而不是调用对象是谁),所以我给了 Triangle将其自己的 readPolygon(&Polygon) 变量副本分类。在 Triangle 类的定义中添加了以下内容:
// Read Polygon variables with separate function unique to Triangle class
int readProtected_P_from_T (const Polygon& inPoly) { return inPoly.protectedPoly; }
int readPublic_P_from_T (const Polygon& inPoly) { return inPoly.publicPoly; }
添加了 readPublic_P_from_T() 函数以检查函数格式的位置。
这不会编译,并出现错误:“'protectedPoly' is a protected member of 'Polygon'”
我希望这能起作用,因为我认为派生类可以看到受保护的变量。
当从派生类调用时,我希望第一个 readPrivate 函数不起作用。
有人可以解释一下这些访问说明符是如何工作的吗?
解决方案
类中的任何函数都可以访问其私有变量。它也可以从继承的类中访问受保护的和公共的变量。
如果函数本身是公开的,任何人都可以调用它。
通常私有变量通过其成员函数用于类的内部需求,而不是用于公共的。但是,公共成员函数可以使用它们来执行特定操作。
在您的情况下,所有成员函数都是公共的。因此,您可以调用它们来访问类内部的任何内部数据。
如果要失败,请尝试不使用该功能直接访问成员数据。例如
class A {
int a = 0;
public:
int b = 1;
int getA() {
return a;
}
};
A c1;
cout << c1.a << c1.b;
编译器将在成员访问时失败,因为a
是私有的。
另一方面,如果你使用getA()
函数,它会起作用,因为函数本身可以访问私有成员:
cout << c1.getA() << c1.b;
推荐阅读
- class - 在 Delphi 的一个模块中使用另一个模块中的全局类对象
- javascript - 检测文本框内容并转换为本地存储的问题
- python - 运行带有参数的 Python 脚本作为 Windows 服务
- node.js - json 响应未在 express 中压缩
- javascript - 在 JQuery Mobile 中拖动图像
- optimization - 约束说向量的所有元素在 scipy 优化中必须 >= 0
- css - CSS - 在元素文本后面的伪元素之前
- python - 在带有 iframe 的 django 模板中使用 sys.exit() 时出错
- python - 在python中使用破折号从URL中提取域
- reactjs - 自定义 Hook 和级联下拉菜单