私有继承的疑问
public:
void initp(float xx=0,float yy=0){x=xx;y=yy;}
void move{float xoff,float yoff}{x+=x0ff;y+=yoff;}
float getx(){return x;}
float gety(){return y;}
private:
float x,y;
};
class rectangle:private point
{
public:
void initr(float,x float y,float w,float h)
{intp(x,y);W=w;H=h;}
void move(float xoff,float yoff)
{point::move(xoff,yoff);}
float getX(){return point::getx();} //这是什么意思?
float getY(){return point::gety();} //这是什么意思?
float getH(){return H;}
float getW(){return W;}
private:
float W,H;
};
void main()
{
rectangle rect;
rect.initr(2,3,20,10);
rect.move(3,2);
cout < < "the date of rect(x,y,w,h): " < <endl;
cout < <rect.getx() < < ", ";
cout < <rect.gety() < < ", ";
cout < <rect.getW() < < ", ";
cout < <rect.getH() < < ", ";
}
----
上面的
float getX(){return point::getx();}
float getY(){return point::gety();}
=======
return point::getx();
又不是静态成员,能这样引用么?
return point::getx();
是什么用意?
----
前面的贴子给分多,现在没分了,望谅。
[解决办法]
说明调用基类的函数,私有继承,基类接口在子类中已经不是public 了,所以要自己写过个调用下
[解决办法]
float getX(){return point::getx();} //显式调用基类的私有函数,子类的函数相当于隐藏了父类的函数。
float getY(){return point::gety();}
[解决办法]
这个确实不是你一时能明白的。因为,你现在用的书恐怕没讲子类隐藏父类同名函数问题,和类名限定问题。
早点换C++ Primer吧。
[解决办法]
float getX(){return point::getx();}
float getY(){return point::gety();} 调用父类的函数。
return point::getx();
又不是静态成员,能这样引用么?
为什么不能呢。
return point::getx();
是什么用意?
反回x坐标吧。
[解决办法]
由于是私有继承,所以父类point中的getx()和gety()方法,在子类中的访问权限都是private。
也就是说,如果你定义了子类的一个对象,比如:
rectangle rec;
然后用此对象去调用getx()方法将会引起访问权限违例。 rec.getx()不合法,因为在rectangle类中,getx()是私有函数。所以在这里提供一个public访问权限的getX()函数,在getX()中调用getx()。
point::getx(),只是一种作用域限定,意思是调用子类中的getx()函数。如果不加point::限定,在这个例子当中,编译器也能正确解析函数调用。加上point::限定,更清晰,而且减少编译器解析的时间。
------解决方案--------------------
我前面的解答有笔误。
point::getx(),只是一种作用域限定,意思是调用父类中的getx()函数。
》》直接用::
》》不就行了么?
》》为什么还要加point
如果用::,意思是调用全局域中的getx()函数,全局域中有getx()函数吗?
这里要调用的父类中的getx()函数,所以只能用point::来限定。或者不限定也可以,但是绝对不能用::限定。
[解决办法]
其实也可以这样用:
class rectangle:private point
{
public:
using point::getx;
}
[解决办法]
呃,时间就是生命,时间就是金钱。C++ Primer打完折也就75左右,少玩一次就回来了。