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

时间:2017-05-16 08:19:00

标签: c++ inheritance protected

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无法通过指针或对象访问。 谁能告诉我为什么?

2 个答案:

答案 0 :(得分:1)

继承意味着您可以访问基类的受保护成员,这意味着在您的情况下,Point :: y可以在类中用作Quadrilateral :: y和Trapezoid :: y,但这并不意味着您可以访问y来自任何其他Point对象,如果它们是成员,也不会 从Point继承只是为了访问A.y是错误的 所以Trapezoid可以因为继承而访问A,但它无法访问A.y,因为成员A的可访问性与问题中的继承无关。

请参阅this simpler example

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

答案 1 :(得分:0)

Point已保护成员,难怪无法访问它们。你应该公开它们。

其他要点:

  • Quadrilateral不应该继承Point,因为这没有意义。
  • 某些语法不是真正的c ++,你应该修复它(例如class classisTrapezoid参数列表中的代码。
  • 使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;
    }
};