什么是访问说明符? 我应该inheritance与私人,受保护或公共?

我对访问修饰符在inheritance方面的含义感到困惑。 涉及privateprotectedpublic关键字的inheritance有什么区别?

什么是访问说明符?

C ++中有一个类/结构体/联合体有3个access specifiers 。 这些访问说明符定义了如何访问类的成员。 当然,任何类的成员都可以在该类中访问(在同一类的任何成员函数内)。 前进到types的访问说明符,它们是:

公开 – 声明为公开的成员可以通过课堂的对象从课堂外访问。

受保护的 – 被声明为Protected的成员可以从类之外的其他类访问, 但是只能从类派生出来。

私人 – 这些成员只能在课堂内进行访问。 不允许外部访问。

源代码示例:

 class MyClass { public: int a; protected: int b; private: int c; }; int main() { MyClass obj; obj.a = 10; //Allowed obj.b = 20; //Not Allowed, gives compiler error obj.c = 30; //Not Allowed, gives compiler error } 

inheritance和访问说明符

C ++中的inheritance可以是以下types之一:

  • Privateinheritance
  • Publicinheritance
  • Protectedinheritance

以下是每个成员的访问规则:

首先也是最重要的规则一个class级的Private成员除了同一class级的成员以外不能从任何地方进入。

公共inheritance:

基类的所有Public成员都成为派生类的Public成员,
基类的所有Protected成员都成为派生类的Protected成员。

即成员的访问没有变化。 我们之前讨论的访问规则进一步适用于这些成员。

代码示例:

 Class Base { public: int a; protected: int b; private: int c; }; class Derived:public Base { void doSomething() { a = 10; //Allowed b = 20; //Allowed c = 30; //Not Allowed, Compiler Error } }; int main() { Derived obj; obj.a = 10; //Allowed obj.b = 20; //Not Allowed, Compiler Error obj.c = 30; //Not Allowed, Compiler Error } 

私人inheritance:

基础类的所有Public成员都成为派生类的Private成员,
基类的所有Protected成员都成为派生类的Private成员。

代码示例:

 Class Base { public: int a; protected: int b; private: int c; }; class Derived:private Base //Not mentioning private is OK because for classes it defaults to private { void doSomething() { a = 10; //Allowed b = 20; //Allowed c = 30; //Not Allowed, Compiler Error } }; class Derived2:public Derived { void doSomethingMore() { a = 10; //Not Allowed, Compiler Error, a is private member of Derived now b = 20; //Not Allowed, Compiler Error, b is private member of Derived now c = 30; //Not Allowed, Compiler Error } }; int main() { Derived obj; obj.a = 10; //Not Allowed, Compiler Error obj.b = 20; //Not Allowed, Compiler Error obj.c = 30; //Not Allowed, Compiler Error } 

受保护的inheritance:

基类的所有Public成员都成为派生类的Protected成员&
基类的所有Protected成员都成为派生类的Protected成员。

代码示例:

 Class Base { public: int a; protected: int b; private: int c; }; class Derived:protected Base { void doSomething() { a = 10; //Allowed b = 20; //Allowed c = 30; //Not Allowed, Compiler Error } }; class Derived2:public Derived { void doSomethingMore() { a = 10; //Allowed, a is protected member inside Derived & Derived2 is public derivation from Derived, a is now protected member of Derived2 b = 20; //Allowed, b is protected member inside Derived & Derived2 is public derivation from Derived, b is now protected member of Derived2 c = 30; //Not Allowed, Compiler Error } }; int main() { Derived obj; obj.a = 10; //Not Allowed, Compiler Error obj.b = 20; //Not Allowed, Compiler Error obj.c = 30; //Not Allowed, Compiler Error } 

请记住,相同的访问规则适用于inheritance层次结构中的类和成员。


重要的注意点:

– 访问规范是每类不是每个对象

请注意,访问规范C ++基于每个类而不是每个对象。
一个很好的例子就是在复制构造函数或复制赋值运算符函数中,可以访问被传递的对象的所有成员。

– 派生类只能访问自己的基类的成员

考虑下面的代码示例

 class Myclass { protected: int x; }; class derived : public Myclass { public: void f( Myclass& obj ) { obj.x = 5; } }; int main() { return 0; } 

它给编译错误:

prog.cpp:4:错误:“int Myclass :: x”被保护

因为派生类只能访问自己的基类的成员。 请注意,在这里传递的obj对象与其被访问的derived类函数无关,它是一个完全不同的对象,因此derived成员函数不能访问其成员。


什么是friendfriend如何影响访问规范规则?

你可以声明一个函数或类作为另一个类的friend 。 当您这样做时,访问规范规则不适用于friend ed类/函数。 该类或函数可以访问该特定类的所有成员。

那么friend的rest封装?

不,他们不,相反,他们提高封装!

friend船被用来表示两个实体之间有意的强耦合
如果两个实体之间存在特殊关系,以至于需要访问其他privateprotected成员,但是您不希望每个人都使用public访问说明符访问,则应该使用friend发送。

Scott Meyers在Effective C ++中的解释可能有助于理解何时使用它们 – 公有inheritance应该模型化为一种关系,而私有inheritance则应该用于“is-implemented-in-terms-of” – 所以你没有坚持超类的接口,你只是重用了实现。