【问题标题】:Public function of Base class not available in derived class with protected access specifier基类的公共函数在具有受保护访问说明符的派生类中不可用
【发布时间】:2021-11-10 06:50:02
【问题描述】:

下面是我的基类:

Vehicle
{
protected: //members being inherited
public:
    void getDetails();
};

这是我的派生类:

class Car : protected Vehicle
{}

现在我正在尝试通过派生类对象访问基类的公共函数。根据我的理解,基类的公共功能是由派生类继承的,所以它应该可以工作。

Car obj2;
obj2.getDetails(); /*Public func of base class*/

但我收到如下错误: 'Vehicle::getDetails' 无法访问,因为 'Car' 使用 'protected' 从 'Vehicle' 继承

有人可以解释一下吗?我错过了什么?

【问题讨论】:

  • 你缺少的是“正常”的 public 继承。
  • 如果您希望方法保留public,为什么要使用protected 继承?也许Difference between private, public, and protected inheritance 值得一看。
  • @Quimby 我只是在学习 OOPs 概念,从 C 语言转移。所以如果可以的话,你能详细说明为什么这是不好的做法吗?
  • @Magzash 不用担心,这不是坏习惯,只是使用不正确。 protected继承使所有基类的公共方法protected,因此得名。由于您希望 getDetails 保持公开状态,因此您希望 public 继承。请参阅我链接的答案,它很好地概述了关键字的工作原理。 protected 表示只能从类内部和派生类内部调用。 private 只允许前者。

标签: c++ inheritance compiler-errors visual-studio-2019


【解决方案1】:

当 Car 从 Vehicle 继承时,您使用的是“受保护”访问说明符。这意味着受保护的成员按原样继承,但公共成员也作为受保护的成员继承,因为这是您允许的最高可访问性级别。因此 getDetails 函数在 Car 中受到保护,这意味着您无法在类外访问它。 改用 public 应该可以解决您的问题:

class Car : public Vehicle

【讨论】:

  • 非常感谢.. 这对我理解这个概念非常有用.. 这一行 - “所以 getDetails 函数在 Car 中受到保护,这意味着您无法在课堂外访问它。”太有用了。我所做的是在 Car 类的另一个函数中访问 getDetails() 函数,它就像一个魅力。 void Car::getCarD(){this->getDetails();}
  • @Magzash 只是关于你最后一句话的注释。您观察到的是访问规则基于类型而不是对象工作。所以任何Car 对象都可以访问任何其他Car 对象的私有字段。
【解决方案2】:

在 C 中的伪 OOP 中,您可能会更好地理解这一点。

class Car : protected Vehicle
{};

类似于

class Car
{
 protected:
  Vehicle vehicle;  // hidden or unnamed member.
};

电话

obj2.getDetails();

可以像呼叫隐藏成员一样进行成像

obj2.vehicle.getDetails();

obj2.vehicle 不可访问,因为它受到保护,并且公共 getDetails 在受保护成员中不可访问。

您可以将protected: 替换为public:private:,看看访问修饰符是如何工作的。

【讨论】:

  • 谢谢。有助于理解
猜你喜欢
  • 2018-05-07
  • 2014-12-26
  • 2018-04-17
  • 1970-01-01
  • 2020-12-24
  • 2016-03-11
  • 2014-08-27
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多