C++访问说明符理解
c++ access-specifier understanding
我在一个线程中遇到了以下响应:
可以从派生的 classes 访问受保护的成员。私人的不行。
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
};
...
1) 我的问题是:
我读过:“一个 class 派生列表命名一个或多个基 classes 并具有以下形式:
class derived-class: access-specifier base-class
其中 access-specifier 是 public、protected 或 private 之一,base-class 是先前定义的 class 的名称。如果不使用访问说明符,则默认情况下它是私有的。 " 和 "私有继承:从私有基 class 派生时,public 和基 class 的受保护成员成为派生 class 的私有成员。
"
SO...在我们的示例中 class Derived : Base 等效于 class Derived : private Base 因为没有定义访问说明符,但代码如作者所说,那么我缺少什么?- 我认为 class 派生访问说明符的 Base class 是 private 因此 public 和 Base 的受保护成员对于 class 派生应该是私有的并且不能访问...谢谢!
这是一种类似的想法。它不是应用于您可以访问的 class 的哪些成员,而是应用于您可以访问的 class 基数。
class A
{
public:
void f();
};
class B : public A
{
public:
void g()
{
f(); // OK
A *a = this; // OK
}
};
class B2 : public B
{
public:
void h()
{
f(); //OK
A *a = this; // OK
};
};
B b;
A& ba = b;
class C : protected A
{
public:
void g()
{
f(); // OK, can access protected base
A *a = this; // OK, can access protected base
}
};
class C2 : public C
{
public:
void h()
{
f(); // OK, can access protected base
A *a = this; // OK, can access protected base
};
};
C c;
c.f(); // Not OK, allthough A::f() is public, the inheritance is protected.
A& ca = c; // Not OK, inheritence is protected.
class D : private A
{
public:
void g()
{
f(); // OK because A is a base of D
A *a = this;
}
};
class D2 : public D
{
public:
void h()
{
f(); //Not OK, A is inherited with private in D
A *a = this; //Not OK
};
};
D d;
d.f(); // Not OK, allthough A::f() is public, the inheritance is private.
D& da = d; // Not OK, inheritence is private.
我在一个线程中遇到了以下响应:
可以从派生的 classes 访问受保护的成员。私人的不行。
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
};
...
1) 我的问题是: 我读过:“一个 class 派生列表命名一个或多个基 classes 并具有以下形式:
class derived-class: access-specifier base-class
其中 access-specifier 是 public、protected 或 private 之一,base-class 是先前定义的 class 的名称。如果不使用访问说明符,则默认情况下它是私有的。 " 和 "私有继承:从私有基 class 派生时,public 和基 class 的受保护成员成为派生 class 的私有成员。
"
SO...在我们的示例中 class Derived : Base 等效于 class Derived : private Base 因为没有定义访问说明符,但代码如作者所说,那么我缺少什么?- 我认为 class 派生访问说明符的 Base class 是 private 因此 public 和 Base 的受保护成员对于 class 派生应该是私有的并且不能访问...谢谢!
这是一种类似的想法。它不是应用于您可以访问的 class 的哪些成员,而是应用于您可以访问的 class 基数。
class A
{
public:
void f();
};
class B : public A
{
public:
void g()
{
f(); // OK
A *a = this; // OK
}
};
class B2 : public B
{
public:
void h()
{
f(); //OK
A *a = this; // OK
};
};
B b;
A& ba = b;
class C : protected A
{
public:
void g()
{
f(); // OK, can access protected base
A *a = this; // OK, can access protected base
}
};
class C2 : public C
{
public:
void h()
{
f(); // OK, can access protected base
A *a = this; // OK, can access protected base
};
};
C c;
c.f(); // Not OK, allthough A::f() is public, the inheritance is protected.
A& ca = c; // Not OK, inheritence is protected.
class D : private A
{
public:
void g()
{
f(); // OK because A is a base of D
A *a = this;
}
};
class D2 : public D
{
public:
void h()
{
f(); //Not OK, A is inherited with private in D
A *a = this; //Not OK
};
};
D d;
d.f(); // Not OK, allthough A::f() is public, the inheritance is private.
D& da = d; // Not OK, inheritence is private.