什么是访问说明符? 我应该inheritance与私人,受保护或公共?
我对访问修饰符在inheritance方面的含义感到困惑。 涉及private
, protected
和public
关键字的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之一:
-
Private
inheritance -
Public
inheritance -
Protected
inheritance
以下是每个成员的访问规则:
首先也是最重要的规则一个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
成员函数不能访问其成员。
什么是friend
? friend
如何影响访问规范规则?
你可以声明一个函数或类作为另一个类的friend
。 当您这样做时,访问规范规则不适用于friend
ed类/函数。 该类或函数可以访问该特定类的所有成员。
那么
friend
的rest封装?
不,他们不,相反,他们提高封装!
friend
船被用来表示两个实体之间有意的强耦合 。
如果两个实体之间存在特殊关系,以至于需要访问其他private
或protected
成员,但是您不希望每个人都使用public
访问说明符访问,则应该使用friend
发送。
Scott Meyers在Effective C ++中的解释可能有助于理解何时使用它们 – 公有inheritance应该模型化为一种关系,而私有inheritance则应该用于“is-implemented-in-terms-of” – 所以你没有坚持超类的接口,你只是重用了实现。