【问题标题】:Error on C++: "error: int aaa::bbb is protected within this context"C++ 错误:“错误:int aaa::bbb 在此上下文中受到保护”
【发布时间】:2020-10-31 13:50:12
【问题描述】:

在使用 C 编程多年后,我正在使用 C++ 迈出第一步。

我试图掌握“受保护”的概念,网上有很多材料解释了protected 变量是什么以及它们的用途。然而,当我尝试编写一个超级基本的示例时,只是为了让我的手弄脏 C++,我遇到了一个错误:

错误:“int parent::protected1”在此上下文中受到保护

因此,我们将不胜感激。

class parent {
public:
    int getProtected() { return protected1; }
protected:
    int protected1;
};

class child: public parent { };

int main()
{
    child ch;

    cout << ch.protected1 << endl;    // error: 'int parent::protected1' is protected within this context
    cout << ch.getProtected() << endl;   // OK
    return 0;
}

到处都说protected 变量只能在继承层次结构中访问。如果是这样的话,我试图理解 - 我在这里做错了什么?

“受保护变量”的概念还没有真正深入人心。private 很好理解,因为私有变量属于子实例,因此只能由子方法访问。但是,如果孩子可以访问父级的protected 变量,是否意味着必须先实例化父级,然后孩子才能访问此protected 变量?

【问题讨论】:

  • 您在这里尝试使用protected 变量的方式等同于它是private。要像这样访问它,它需要是public
  • 建议:不要在没有一些好的参考资料的情况下从 C 迁移到 C++。考虑到语言通常是多么相似,行为上的差异可能会非常不和谐。两种语言的意识形态截然不同,因此即使行为相同,在 C++ 中做某事的最佳方式也可能完全不同。我有 3 年的真正糟糕的代码,我仍在寻找和清理过渡时期的代码,然后我才开始阅读一些好书,学到的不仅仅是语法差异。过渡的时间越短,你的生活就会越好。

标签: c++ inheritance syntax-error protected


【解决方案1】:

受保护的成员变量只能通过父类或子类的成员函数访问,如您的示例所示。因此:

ch.protected1

由于您试图从类外部访问数据成员,因此无法编译。

【讨论】:

    【解决方案2】:

    第一个问题:到处都说受保护的变量只能在继承层次结构中访问。如果是这样的话,我试图理解 - 我在这里做错了什么。

    您正试图从main 访问受保护的成员,而main 在继承层次结构之外。正如private 对类外部的代码隐藏类的部分实现一样,protected 对层次结构之外的代码隐藏类的部分实现。由于main 既在类之外又在层次结构之外,所以protectedprivate 都隐藏起来。

    第二个问题:“受保护变量”的概念还没有真正深入。“私有”很好理解,因为私有变量属于子实例,因此只能由子方法访问。但是,如果一个子级可以访问父级的受保护变量,是否意味着必须先实例化父级,然后子级才能访问此受保护变量?

    必须先实例化父级,然后才能实例化子级。孩子是他们父母的实例。

    如果你有class car : public vehicle,那么每个car 也是一个vehicle。如果你有一个car 类的实例,你也必然有一个vehicle 的实例。

    【讨论】:

    • 请注意:孩子是他们父母的实例。非常重要。在 C++ 中,继承是 Is-A relationship。孩子父母。约翰的儿子拉尔夫就是约翰。在任何可以使用父母的地方,您都可以使用孩子。如果爸爸会开车,儿子会开车。即使儿子是个蹒跚学步的孩子。如果您不及早掌握这一点,这可能会导致一些奇怪的代码和奇怪的错误。这可能就是为什么在讨论编程中的继承时,基类和派生类比父类和子类更受青睐。
    【解决方案3】:

    您正在尝试直接访问类成员protected1。仅当成员为 public 时才可能这样做。

    您的班级child 仍然可以访问该成员,因此您可以尝试:

    class parent {
    public:
        int getProtected() { return protected1; }
    protected:
        int protected1;
    };
    
    class child: public parent { 
    public:
      int getProtectedFromChild() { return protected1; }
    };
    
    int main()
    {
        child ch;
    
        cout << ch.getProtected() << endl;   // OK
        cout << ch.getProtectedFromChild() << endl;   // This should work
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      protected 表示您的类child 可以访问parent(它公开继承)类的protected1 字段。如果 protected 改为 privatechild 将无法访问此变量。

      您的 main() 函数不在 parent 的派生类中 - 因此它无法访问 protected 字段。

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 2015-10-02
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 1970-01-01
        • 2016-11-24
        相关资源
        最近更新 更多