如何在C ++中实现private和protected

时间:2016-03-28 06:09:24

标签: c++

C ++中私有和受保护关键字的内部机制。它们如何限制成员变量访问。

3 个答案:

答案 0 :(得分:2)

对于类对象的内存布局,从给定的访问说明符到下一个,编译器必须将数据成员放在增加的地址。更一般地说,它必须在增加地址的情况下将成员置于相同的访问级别。对于不同访问级别的成员,情况并非如此。

C ++11§9.2/ 14:
  

分配了具有相同访问控制(第11条)的(非联合)类的非静态数据成员   后来的成员在类对象中有更高的地址。非静态数据的分配顺序   具有不同访问控制的成员未指定。

这是关于运行时效果的唯一(影响),可以说是我所知道的“内部机制”的措辞。

所有其余的,检查,都在编译时。

答案 1 :(得分:0)

我不认为具有不同访问级别的方法/变量之间存在任何运行时差异。这都是在编译时强制执行的。

答案 2 :(得分:0)

我认为Private和Protected都只作为访问说明符。我们只能实现向他人提供数据访问权限。这些访问权限决定编译时间。

大多数使用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
};