Line和Point是两个类,所以你的length不能直接存取Point的非公有成员(除非是在子类)。但是这里你错误地认为,继承后就可以存取p1对象的x。这里Line可以存取的只是基类Point中的x,所以以下代码是可以编译的:
float length() const
{
return sqrt(x * x, y * y); // 注意,这里没有使用p1.x,因为p1.x是非公有的
}
再有,从Point继承来实现Line本身这个想法有问题,公有继承一般情况下需要符合Liskov替换原则(当然有时候我们不一定能够完全做到,但是尽量符合这个原则)。你可以定义Line不从Point继承。