无法访问派生 class 函数内部基 class 的受保护数据成员
Cannot access protected data members of base class, inside derived class function
#include <iostream>
#include <cmath>
using namespace std;
class Point
{
protected:
double x,y,z;
double mag;
public:
Point(double a=0.0, double b=0.0, double c=0.0) : x(a), y(b), z(c)
{
mag = sqrt((x*x)+(y*y)+(z*z));
}
friend ostream& operator<<(ostream& os, const Point& point);
};
ostream& operator<<(ostream& os, const Point& point)
{
os <<"("<<point.x<<", "<<point.y<<", "<<point.z<<") : "<<point.mag;
return os;
}
class ePlane : public Point
{
private:
Point origin;
public:
static double distance(Point a, Point b);
ePlane() : origin(0,0,0){}
};
double ePlane::distance(Point a, Point b) //does not compile
{
return sqrt(pow((a.x-b.x),2)+pow((a.y-b.y),2)+pow((a.z-b.z),2));
}
int main()
{
Point a(3,4,0);
Point b(6,8,0);
cout <<a<<endl;
cout <<b<<endl;
cout <<ePlane::distance(a,b)<<endl;
return 0;
}
当 class Point
的数据成员 double x,y,z
声明为 protected
时,上述程序无法编译。我不明白为什么它不能编译,因为 base class 的受保护成员应该可以在派生 class ePlane
中访问
我不想使用友元函数来实现它,因为受保护的成员应该已经可以访问了
假设我们有一个 class B
,以及一个从 B
派生的 class D
。受保护访问的规则不仅仅是:
"D
可以访问 B
"
的受保护成员
相反,规则是:
"D
可以访问 inherited 受保护的 B
成员。换句话说,D
可以访问 [=10] 的受保护成员=] 属于 D
类型的对象(或派生自 D
)。"
在您的情况下,这意味着 distance
的参数必须键入 ePlane
以便 distance
能够访问它们。
#include <iostream>
#include <cmath>
using namespace std;
class Point
{
protected:
double x,y,z;
double mag;
public:
Point(double a=0.0, double b=0.0, double c=0.0) : x(a), y(b), z(c)
{
mag = sqrt((x*x)+(y*y)+(z*z));
}
friend ostream& operator<<(ostream& os, const Point& point);
};
ostream& operator<<(ostream& os, const Point& point)
{
os <<"("<<point.x<<", "<<point.y<<", "<<point.z<<") : "<<point.mag;
return os;
}
class ePlane : public Point
{
private:
Point origin;
public:
static double distance(Point a, Point b);
ePlane() : origin(0,0,0){}
};
double ePlane::distance(Point a, Point b) //does not compile
{
return sqrt(pow((a.x-b.x),2)+pow((a.y-b.y),2)+pow((a.z-b.z),2));
}
int main()
{
Point a(3,4,0);
Point b(6,8,0);
cout <<a<<endl;
cout <<b<<endl;
cout <<ePlane::distance(a,b)<<endl;
return 0;
}
当 class Point
的数据成员 double x,y,z
声明为 protected
时,上述程序无法编译。我不明白为什么它不能编译,因为 base class 的受保护成员应该可以在派生 class ePlane
我不想使用友元函数来实现它,因为受保护的成员应该已经可以访问了
假设我们有一个 class B
,以及一个从 B
派生的 class D
。受保护访问的规则不仅仅是:
"D
可以访问 B
"
相反,规则是:
"D
可以访问 inherited 受保护的 B
成员。换句话说,D
可以访问 [=10] 的受保护成员=] 属于 D
类型的对象(或派生自 D
)。"
在您的情况下,这意味着 distance
的参数必须键入 ePlane
以便 distance
能够访问它们。