首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

私有继承的疑问,该怎么解决

2012-04-14 
私有继承的疑问public:voidinitp(floatxx0,floatyy0){xxxyyy}voidmove{floatxoff,floatyoff}{x+x0f

私有继承的疑问
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左右,少玩一次就回来了。

热点排行