如何使C 继承保护访问说明器

How to make C++ inheritance preserve access specifer

本文关键字:访问 说明 保护 继承 何使      更新时间:2023-10-16

可能的重复:
什么是访问说明符?我应该继承私人,受保护还是公开?

如何在C 中创建一个派生类,该类保留了属性和方法的访问说明符:

class Base
{
private:
    void base_private();
protected:
    void base_protected();
public:
    void base_public();
};
class A: [what type is appropriate here?] Base
{
public:
    void test() {
        base_protected(); // Ok
    }
};
class B: [what type is appropriate here?] A
{
public:
    void test() {
        base_protected(); // Ok
    }
};
int main()
{
    A a;
    B b;
    a.base_public();        // Ok
    a.base_protected();     // Not Ok
    b.base_protected();     // Not Ok
    b.test();               // Ok
    return 0;
}

我的意思是base_protected()方法在派生类中仍然受到保护,但base_public()是公共的。

让我们考虑Base成员的可用性:

  • base_private不可用客户使用,但Base本身可用
  • base_protected不可用客户端可用,但Base本身可用
  • base_public可用于客户端和Base

现在,如果您有class A : public Base(公共继承),则Base成员的可用性为:

  • base_private不可用客户端可用, A本身
  • base_protected不可用客户使用,但A本身可用
  • base_public可供客户端和A
  • 使用

现在,您要问的是如何保留两个类BaseA的同一客户端接口。如果您查看上面列表中客户端的会员的可用性,则您会发现BaseAbase_private完全相同。base_protected不可用;和base_public可用。

BaseA之间唯一更改的是A无法访问Base私有的成员。这就是protected访问控件的全部要点 - 它使派生的类访问其基类成员而不使客户端可用。

所以public继承是您需要的。

派生类可以访问基类的publicprotected成员,无论您是继承privateprotected还是public

继承private时,基类的所有成员均被视为A的派生类privateprotected继承类似,A的派生类可能访问protectedpublic Base成员。

在两种情况下,privateprotected继承,Base的成员都无法访问"公共"。

现在要回答您的问题,请使用public继承来保留基类的访问说明符。