公共/受保护/私有继承的问题

Posted

技术标签:

【中文标题】公共/受保护/私有继承的问题【英文标题】:Trouble with public/protected/private inheritance 【发布时间】:2012-08-16 17:59:30 【问题描述】:

我正在尝试一个简单的 C++ 继承示例。但我就是拿不下来。当我尝试从类A 继承类B 的受保护成员时,它说A::baz 是受保护的。

#include <iostream>

class A 
    public:
        int foo;
        int bar;
    protected:
        int baz;
        int buzz;
    private:
        int privfoo;
        int privbar;
;

class B : protected A ; // protected members go to class B, right?

int main() 
    B b;

    b.baz; // here is the error [A::baz is protected]

我似乎找不到我做错了什么。我尝试将class B : protected A 更改为: public A,但它仍然不起作用。

【问题讨论】:

很少使用公共继承以外的任何东西。 parashift.com/c++-faq/access-rules-with-priv-inherit.html 【参考方案1】:

受保护的继承只会影响您的类的客户如何看待基类的 public 接口。受保护的继承将基类的公共成员标记为对继承类的用户受保护。

所以您的示例中的baz 不是公开的,它受到 B 保护,因此编译器错误。

【讨论】:

如果我没有使用publicprivateprotected 并且只是使用了:class B : A ?? @user6607 然后默认是私有的【参考方案2】:

您可以从派生类内部访问protected 成员,而不是外部。

class B : protected A 

   void foo() 
   
       int x = foo; //ok
       x = baz;     //ok
       x = privfoo; //error
   
;

继承类型仅限制基类访问。比如你选择protected继承,A中的所有public方法对外都会变成protected,其余的保持不变。

【讨论】:

【参考方案3】:

受保护的字段只能由声明它们的类中的方法或从声明类继承的类访问。您正在尝试从全局函数访问受保护的字段。

【讨论】:

【参考方案4】:

因为A::baz受到保护,所以B可以访问它:

class B : public A

  public:
    int some_other_method()
    
        return baz;
    
;

但这不会让其他代码访问它。

【讨论】:

【参考方案5】:

受保护的访问说明符类似于私有。这只是 差异实际上发生在继承上。当一个类继承自 另一种,派生类的成员可以访问受保护的 成员继承自基类,但不是其私有成员。

更多信息here

【讨论】:

【参考方案6】:

您应该阅读 C++ 中的公有/私有继承。你想要达到的目的是通过替换来完成的

class B : protected A ;

class B : public A ;

编辑:我读得太快了,没有注意到您尝试从 main 访问 baz。您只能从成员方法访问它。

【讨论】:

【参考方案7】:

当成员为protected 时,只能从定义它的类及其后代的方法中访问它。

您尝试做的是从这些类外部的代码访问protected/private 成员,这是不允许的。您只能从类范围之外访问类的public 成员。

【讨论】:

以上是关于公共/受保护/私有继承的问题的主要内容,如果未能解决你的问题,请参考以下文章

什么是访问说明符?我应该以私有、受保护还是公共继承?

如何禁止公共继承但允许私有(和受保护)继承

子类真的继承私有成员变量吗?

受保护继承的实际用途是啥?

面向对象编程中啥是公共的、私有的和受保护的?

Java通过受保护的getter访问私有超类成员