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
无法通过指针或对象访问。
谁能告诉我为什么?
答案 0 :(得分:1)
继承意味着您可以访问基类的受保护成员,这意味着在您的情况下,Point :: y可以在类中用作Quadrilateral :: y和Trapezoid :: y,但这并不意味着您可以访问y来自任何其他Point对象,如果它们是成员,也不会 从Point继承只是为了访问A.y是错误的 所以Trapezoid可以因为继承而访问A,但它无法访问A.y,因为成员A的可访问性与问题中的继承无关。
正如Michael Walz评论的那样,如果你不希望Point的成员公开或通过成员函数访问,你可以将Trapezoid声明为Point的友元类,这使得Point的所有成员都可以访问Trapezoid。但是,滥用此功能可能会导致意外问题。
答案 1 :(得分:0)
Point
已保护成员,难怪无法访问它们。你应该公开它们。
其他要点:
Quadrilateral
不应该继承Point
,因为这没有意义。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;
}
};