如何在C++中实现私有和受保护

How private and protected is implemented in C++

本文关键字:受保护 实现 C++      更新时间:2023-10-16

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