无法通过指针或对象 c++ 访问受保护的成员

Protected member is not accessible through a pointer or object c++

本文关键字:访问 c++ 受保护 成员 对象 指针      更新时间:2023-10-16

Visual studio告诉我,我无法访问父类的成员变量和父类的实例。 像这样:

class Point{
protected:
    int x, y;
};
class Quadrilateral : public Point
{
protected:
    Point A, B, C, D;
};
class Trapezoid : public Quadrilateral
{
public:
    bool isTrapezoid() {
        if (A.y == B.y && C.y == D.y)
            return true;
        return false;
    }
};

据说Point::y无法通过指针或对象访问。谁能告诉我为什么?

继承意味着您可以访问基类的受保护成员,这意味着在您的情况下,Point::y 可以用作类内的四边形::y 和梯形::y,这并不意味着您可以从任何其他 Point 对象访问 y,如果它们是><成员,也不能。仅仅为了访问>所以梯形可以访问 A,因为继承,但它无法访问 A.y,因为成员 A 的可访问性与问题中的继承无关。

正如Michael Walz所评论的那样,如果你不希望Point的成员是公开的或通过成员函数访问的,你可以将Trapezoid声明为Point的友元类,这使得Point的所有成员都可以被梯形访问。 但是,滥用此功能可能会导致意外问题。

Point有受保护的成员,难怪他们无法访问。你应该把它们公开。

其他要点:

  • Quadrilateral不应该继承Point,因为这没有意义。
  • 有些语法不是真正的C ++,你应该修复它(例如 class class、代码内部的参数列表isTrapezoid
  • 使isTrapezoid成为可以在Quadrilateral上调用的方法,这应该是一个const的方法。
  • 对于像这样的简单类,也许你应该让所有成员都公开(取决于你的代码设计(。

class Point
{
public:
    int x, y;
};
class Quadrilateral
{
public:
    Point a, b, c, d;
    bool isTrapezoid() const
    {
        return a.y == b.y && c.y == d.y;
    }
};