关于基类对派生类的访问

Flyalay 2008-03-20 07:57:42
#include <iostream>
using namespace std;

class base
{
public:
base(const int&m,const int &n):x(m),y(n){}
base(const base& t){
x=t.x;
y=t.y;
z=t.z;
}
virtual void display(){
cout << x << ' ' << y << ' ' << z << endl;
}
virtual ~base(){};
protected:
int x;
int y;
private:
int z;
};

class derived:public base
{
public:
derived(const int&m,const int&n,const int&p):base(m,n),z(p){}
void display(){
cout << x << ' ' << y << ' ' << z << endl;
}
int z;


};


int main()
{
derived tb(5,7,8);
base ta(tb);
ta.display();
tb.display();
cout << tb.z;
system("pause");
}

为什么在派生类转换为基类中,基类的成员函数能对派生类的protected的成员访问.
却不能对public中的z成员访问(z无法初始化).
...全文
145 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT_lau 2008-03-20
  • 打赏
  • 举报
回复
z的作用域问题
jieao111 2008-03-20
  • 打赏
  • 举报
回复
它设计时不知道,,派生类的情况..
jieao111 2008-03-20
  • 打赏
  • 举报
回复
基类对派生类没有访问权根....
Maxwell 2008-03-20
  • 打赏
  • 举报
回复
晕,我理解错了你的问题。

给你解释一下
derived tb(5,7,8);
这里初始化的是base::x, base::y, derived::z,而base::z未初始化
base ta(tb);
这里用tb初始化ta的时候ta只能访问到base::x, base::y, base::z,而derived::z是访问不到的
ta.display();
这里应该输出5, 7, 随机值,实际上就是base::x, base::y, base::z
tb.display();
这里应该输出5, 7, 8,实际上是base::x, base::y, derived::z
cout < < tb.z;
这个是derived::z

>为什么在派生类转换为基类中,基类的成员函数能对派生类的protected的成员访问.
>却不能对public中的z成员访问(z无法初始化).
实际上派生类转换为基类后就只能访问基类中的成员,也就是说derived::z是访问不到的,所以你后面的代码里
class base
{
public:
base(const int&m,const int &n):x(m),y(n){}
base(const base& t){
x=t.x;
y=t.y;
m=t.z;
}
virtual void display(){
cout < < x < < ' ' < < y < < ' ' < < m < < endl;
}
virtual ~base(){};
protected:
int x;
int y;
private:
int m;
};

虽然你传入的tb是derived类型,但是用t引用的时候只能当作base,而base没有z,就会出你那个错误。
Flyalay 2008-03-20
  • 打赏
  • 举报
回复
我用的是DEV-C++

貌似还是不行啊
ryfdizuo 2008-03-20
  • 打赏
  • 举报
回复
     base(const base& t){  
x=t.x;
y=t.y;
m=t.z;
}
//是这里t.z的问题;
Flyalay 2008-03-20
  • 打赏
  • 举报
回复
刚才有了新的发现.

将基类改为
class base
{
public:
base(const int&m,const int &n):x(m),y(n){}
base(const base& t){
x=t.x;
y=t.y;
m=t.z;
}
virtual void display(){
cout << x << ' ' << y << ' ' << m << endl;
}
virtual ~base(){};
protected:
int x;
int y;
private:
int m;
};

编译时会出现'const class base' has no member named 'z'

即没有找到变量z.

怎么才能解决这一问题了?

还想问下基类对派生类是不是有特殊访问权根?
ryfdizuo 2008-03-20
  • 打赏
  • 举报
回复
构造derived类的时候先调用base的构造函数,
derived tb(5,7,8); 这里只是对derived的z初始化,没有初始化base里面的z值,
当derived去构造另外一个base的时候,z当然就...
ryfdizuo 2008-03-20
  • 打赏
  • 举报
回复
deived转化为base的以后,该base里面的z值还没有初始化了,
Maxwell 2008-03-20
  • 打赏
  • 举报
回复
你用的什么编译器?

改成
class derived:public base
{
public:
int z;
derived(const int&m,const int&n,const int&p):base(m,n),z(p){}
void display(){
cout << x << ' ' << y << ' ' << z << endl;
}
};
再试一下。
Flyalay 2008-03-20
  • 打赏
  • 举报
回复
没人解决吗? 我自己顶下.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧