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

一个种的私有数据成员能在其派生类中直接使用吗

2012-09-06 
一个类的私有数据成员能在其派生类中直接使用吗?下面这段代码来自谭浩强老师的《C++程序设计》一书399页,有

一个类的私有数据成员能在其派生类中直接使用吗?
下面这段代码来自谭浩强老师的《C++程序设计》一书399页,有一处不懂,请大家帮忙看一下

C/C++ code
#include<iostream>using namespace std;//声明类Pointclass Point{public:Point(float x=0,float y=0);void setPoint(float,float);float getX() const{return x;}float getY() const{return y;}friend ostream & operator<<(ostream &,const Point &);protected:    float x,y;};//下面定义Point类的成员函数//Point的构造函数Point::Point(float a,float b){    x=a;    y=b;}//设置x和y的坐标值void Point::setPoint(float a,float b){    x=a;    y=b;}//重载运算符“<<”,使之能输出点的坐标ostream & operator<<(ostream &output,const Point &p){output<<"["<<p.x<<","<<p.y<<"]"<<endl;return output;}//声明Point类的派生类Circleclass Circle:public Point{public:Circle(float x=0,float y=0,float r=0);void setRadius(float);float getRadius() const;float area() const;friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<”private:    float radius;};//定义构造函数,对圆心坐标和半径初始化Circle::Circle(float a,float b,float r):Point(a,b),radius(r){}//设置半径值void Circle::setRadius(float r){radius=r;}//读取半径值float Circle::getRadius() const {return radius;}//计算圆面积float Circle::area() const{return (3.14159f)*radius*radius;}//重载运算符“<<”,使之输出圆的信息ostream &operator<<(ostream &output,const Circle &c){    output<<"center=["<<c.x<<","<<c.y<<"],"<<"radius="<<c.radius<<","<<"area="<<c.area()<<endl;    return output;}//声明Circle类的派生类Cylinderclass Cylinder:public Circle{public:    Cylinder(float x=0,float y=0,float r=0,float h=0);    void setHeight(float);    float getHeight() const;    float area() const;    float volume() const;    friend ostream &operator<<(ostream &,const Cylinder &);protected:    float height;};//定义构造函数Cylinder::Cylinder(float a, float b, float r, float h):Circle(a,b,r),height(h){}//设置圆柱高度void Cylinder::setHeight(float h){height=h;}//读取圆柱高度float Cylinder::getHeight() const{return height;}//计算圆表面积float Cylinder::area() const{return 2*Circle::area()+2*(3.14159f)*radius*height;}[color=#FF0000]这里的radius是Circle的私有成员,能直接这样用吗?[/color]//计算圆柱体积float Cylinder::volume() const{return Circle::area()*height;}//重载运算符“<<”ostream &operator<<(ostream &output,const Cylinder &cy){output<<"center=["<<cy.x<<","<<cy.y<<"],r="<<cy.radius<<",h="<<cy.height<<"\narea="<<cy.area()<<",volume="<<cy.volume()<<endl;[color=#FF0000]这里的radius是Circle的私有成员,能直接这样用吗?[/color]return output;}int main(){Cylinder cy1(3.5f,6.4f,5.2f,10);cout<<"\noriginal cylinder:\nx="<<cy1.getX()<<",y="<<cy1.getY()<<",r="<<cy1.getRadius()<<",h="<<cy1.getHeight()<<",area="<<cy1.area()<<"\n"<<",volume="<<cy1.volume()<<endl;cy1.setHeight(15);cy1.setRadius(7.5f);cy1.setPoint(5,5);cout<<"\nnew cylinder:\n"<<cy1;Point &pRef=cy1;cout<<"\npRef as a point:\n"<<pRef;Circle &cRef=cy1;cout<<"\ncRef as a circle:\n"<<cRef;return 0;}

如上面所示红字部分所标注,radius为Circle类的私有成员,在这里怎么能直接使用呢?我自己在VS2008上编译时报错,如下所示:
1>e:\software learning\general software\softwarepractise\c++practise\ex12_1\ex12_1\ex12_1.cpp(82) : error C2248: “Circle::radius”: 无法访问 private 成员(在“Circle”类中声明)
1> e:\software learning\general software\softwarepractise\c++practise\ex12_1\ex12_1\ex12_1.cpp(42) : 参见“Circle::radius”的声明
1> e:\software learning\general software\softwarepractise\c++practise\ex12_1\ex12_1\ex12_1.cpp(34) : 参见“Circle”的声明


1>e:\software learning\general software\softwarepractise\c++practise\ex12_1\ex12_1\ex12_1.cpp(88) : error C2248: “Circle::radius”: 无法访问 private 成员(在“Circle”类中声明)
1> e:\software learning\general software\softwarepractise\c++practise\ex12_1\ex12_1\ex12_1.cpp(42) : 参见“Circle::radius”的声明
1> e:\software learning\general software\softwarepractise\c++practise\ex12_1\ex12_1\ex12_1.cpp(34) : 参见“Circle”的声明
1>生成日志保存在“file://e:\SOFTWARE LEARNING\GENERAL SOFTWARE\softwarepractise\c++practise\ex12_1\ex12_1\Debug\BuildLog.htm”
1>ex12_1 - 2 个错误,0 个警告
但在书上说可以编译通过.这本书已经出版这么多年,应该不会有错,应该是我错了。但实在找不到错在哪里?请大家帮忙给看一下。谢谢。

[解决办法]
不能。 。
[解决办法]
回答lz标题问题: 不能
建议: 不要看谭浩强的书。
[解决办法]
论坛里面回答这个问题必说: C++ primer 
嫌厚可以选薄点的: Accelerated C++

探讨

引用:
回答lz标题问题: 不能
建议: 不要看谭浩强的书。
那看谁的书?大家都说这本书讲的比较容易理解,我也这样觉得。

[解决办法]
探讨

引用:
回答lz标题问题: 不能
建议: 不要看谭浩强的书。
那看谁的书?大家都说这本书讲的比较容易理解,我也这样觉得。

[解决办法]
探讨

引用:
回答lz标题问题: 不能
建议: 不要看谭浩强的书。
那看谁的书?大家都说这本书讲的比较容易理解,我也这样觉得。

[解决办法]
探讨
为什么不要看谭老的书?谭老的书引导入门还是不错的,讲得比较浅显易懂。
我建议多翻翻《C++ Primer》,《C和指针》等书,是遇到有不明白的地方。

[解决办法]
只有保护成员才能在继承类中使用
[解决办法]
不能直接使用的,私有部分如果能直接访问,那就不叫数据封装了。。。。。
[解决办法]
探讨

不能。 。

[解决办法]
标准和语法都不能,也不应该能。
但是,如果喜欢玩儿的话去看看对象内存布局..
[解决办法]
不能,protected,public才可以
[解决办法]
中国人写的书不要看,垃圾。
[解决办法]
探讨
引用:
回答lz标题问题: 不能
建议: 不要看谭浩强的书。
那看谁的书?大家都说这本书讲的比较容易理解,我也这样觉得。

热点排行