派生类指针

jy01807853 2012-04-03 03:56:17

class BASE
{
public:

};

class Derived : private BASE //换成protected也一样
{

};

int main()
{
BASE *p = new Derived;//为什么派生类的指针不能给基类


}
...全文
133 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sheldenwade1 2012-04-03
  • 打赏
  • 举报
回复

class BASE
{
public:
int a;
};

class Derived : public BASE //换成protected也一样
{
public:
int b;
};

看这段代码,BASE *p = new Derived;我们可以通过p->a来调用Derived类中属于BASE的那部分,因为Derived类中属于BASE的那部分是public的访问权限。

class BASE
{
public:
int a;
};

class Derived : private BASE //换成protected也一样
{
public:
int b;
};

上面这段代码里,Derived类中属于Base的那部分(int变量a)是private的访问权限(因为使用了private继承),这是客观事实,不容许改变的,不管是由子类指针还是父类指针指向这个对象,也不会改变。
那么C++设计者们就有两个方案来处理这个问题:
1)允许使用 BASE *p = new Derived,编译时不出错,运行时当使用了p->a时报一个诸如内存不允许为读的运行时出错等等。。。
2)BASE *p = new Derived作为编译时错误处理,直接不允许编译通过。
大家仔细想想,第一种方案虽然能实现,但是却一点必要没有,而且编译器应当尽量的减少运行时错误,降低编写程序的调试成本。第二种方法即容易事先,又符合常理。何乐而不为呢?
xiangbei0707 2012-04-03
  • 打赏
  • 举报
回复
详见C++ primer 489
派生类到基类转换的可访问性
如此美丽的你 2012-04-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:

C/C++ code

BASE *p = static_cast(BASE *)new Derived;//为什么派生类的指针不能给基类

你在gcc试下。
[/Quote]
不用试,gcc肯定编译不过。
qq120848369 2012-04-03
  • 打赏
  • 举报
回复
派生类对象里的基类部分已经是Private了,就算得到其基类部分的地址,在语义上也是属于派生类的private,是不允许直接使用的,所以编译器这样处理合情合理,不需要问为什么。

基类指针指向派生类对象是为了多态存在的,别异想开天的乱指,异想天开请用void*存地址,这个是最原始的C语言。
Kevin_qing 2012-04-03
  • 打赏
  • 举报
回复
protected继承说明你不想让基类被外面可见或访问。
当然就不许把自己转换为基类类型了。
庄鱼 2012-04-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

因为派生类和基类的关系已经不再是一种 Derived is Base这样一种关系,private继承的关系更接近 Derived is implemented with Base ,Base 部分在派生类的访问权限已经不再是public了。所以你不能让基类类型的指针指向派生类对象
[/Quote]
确切地说,private继承的派生类因为没有public接口(基类全部成为private),你不能通过一个非授权(如firend)接口访问一个对象的私有或保护部分。
jy01807853 2012-04-03
  • 打赏
  • 举报
回复
有空的兄弟帮我看下 在 6楼的理解 到底对不?
jy01807853 2012-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

C/C++ code

BASE *p = static_cast(BASE *)new Derived;//为什么派生类的指针不能给基类
[/Quote]
你在gcc试下。
pengzhixi 2012-04-03
  • 打赏
  • 举报
回复
因为派生类和基类的关系已经不再是一种 Derived is Base这样一种关系,private继承的关系更接近 Derived is implemented with Base ,Base 部分在派生类的访问权限已经不再是public了。所以你不能让基类类型的指针指向派生类对象
如此美丽的你 2012-04-03
  • 打赏
  • 举报
回复

BASE *p = static_cast(BASE *)new Derived;//为什么派生类的指针不能给基类
jy01807853 2012-04-03
  • 打赏
  • 举报
回复
我的理解”首先new一个派生类对象。如果基类指针可以接受,

当基类指针试图用他所指向的 派生类对象 调用在派生类中,已经是private部分是非法的。

所以才禁止 基类指针接受 private派生类“ 这样理解?

jy01807853 2012-04-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

详见C++ primer 489
派生类到基类转换的可访问性
[/Quote]
他的解释有点模糊。。
“确定到基类的转换是否可访问。可以考虑基类的public成员是否可访问。
我在派生类的成员函数里。。。base的protected和public都能访问。
jy01807853 2012-04-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

因为派生类和基类的关系已经不再是一种 Derived is Base这样一种关系,private继承的关系更接近 Derived is implemented with Base ,Base 部分在派生类的访问权限已经不再是public了。所以你不能让基类类型的指针指向派生类对象
[/Quote]
派生类访问标号只 控制派生类用户对它从base继承而来的成员的访问,
但是派生类仍然有对基类成员的访问权。

64,648

社区成员

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

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