如何在C++中实现私有和受保护
How private and protected is implemented in C++
C++中私有关键字和受保护关键字的内部机制。它们如何限制成员变量访问。
对于类对象的内存布局,从给定的访问说明符到下一个访问说明符,编译器必须将数据成员放置在不断增加的地址处。更普遍地说,它必须将具有相同访问级别的成员放在不断增加的地址上。对于不同访问级别的成员来说,情况并非如此。
C++11§9.2/14:"具有相同访问控制(第11条)的(非并集)类的非静态数据成员被分配以后的成员在类对象中具有更高的地址。非静态数据的分配顺序未指定具有不同访问控制的成员。
这是关于运行时效应的唯一(影响),它可以符合措辞“内部机制";,据我所知。
其余的所有检查都在编译时进行。
我不认为具有不同访问级别的方法/变量之间存在任何运行时差异。这一切都是在编译时强制执行的。
我认为Private和Protected都只是一个访问说明符。我们唯一能做到的就是向他人提供数据访问权限。这些访问权限决定了编译时间。
大多数使用私有和受保护来实现继承和数据封装。只需查看以下示例:
class Base {
private:
int MyPrivateInt;
protected:
int MyProtectedInt;
public:
int MyPublicInt;
}
class Derived : Base
{
public:
int foo1() { return MyPrivateInt;} // Won't compile!
int foo2() { return MyProtectedInt;} // OK
int foo3() { return MyPublicInt;} // OK
};
class Unrelated
{
private:
Base B;
public:
int foo1() { return B.MyPrivateInt;} // Won't compile!
int foo2() { return B.MyProtectedInt;} // Won't compile
int foo3() { return B.MyPublicInt;} // OK
};
相关文章:
- C++:无法访问声明的受保护成员
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 公共/私有/受保护是否会更改内存中结构的排列?
- 在父类中公开受保护的构造函数
- 如何从其他结构访问受保护的结构变量
- 如何实现返回受保护结构的私有函数
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 从模板化父类中的派生内部类访问受保护的成员变量
- 为什么继承的受保护构造函数不能公开?
- 在使用受保护和继承时无法访问在类中声明的私有成员
- C++中的受保护变量
- 在此上下文中受保护 c++
- 同一模板类但模板类型的受保护成员
- 基类中受保护的纯虚函数如何被基类的友元类使用?
- 在编译器中实现受保护/私有继承
- 如何在C++中实现私有和受保护
- 为什么GoF建议在C++模板方法模式实现中使用受保护的(而不是私有的)虚拟方法
- 实现文件中的实例变量 — 私有与受保护