绝世美女提出的恶梦般的关于基类指针的疑问!(一)

Riddick2046 2005-09-03 02:20:08
今天一美女同事问我一个关于基类指针的问题,要知道,懂计算机到那种程度的女孩 有那么美的 真是世间罕有啊.我竟然没回答出,那个真叫丢脸啊.55555

class A class B :class A

A *a=new B;

a 里所放的内容是不是B类型对像的地址? 我回答是 (请指证)

那么a 为什么不能用B中的成员? 我回答: 这是归定. 她用讽刺的眼光看着我.

如果,不用到虚拟函数的情况下, 这样的语句是不是 一点意义也没有? 如果有,那有什么应用呢?

我想说没意义, 但是没说. 但要说有,我也想不出有啥应用.

都怪我基楚没学好. 555555555555



...全文
1502 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dong 2005-09-16
  • 打赏
  • 举报
回复
不好意思,本人的回答有不全面的错误,本人因为工作太忙没有时间上来改正,在次表示道歉,不过适合这里的情况而已
sandrowjw 2005-09-09
  • 打赏
  • 举报
回复
补一句,如果是单继承的话,a指向的的确是B对象的指针,至少内存地址是一样的。
sandrowjw 2005-09-09
  • 打赏
  • 举报
回复
俺高烧刚退,又看到幻觉了:)
a指向的不是B对象的指针,a只能控制B的基类部分,只不过一般的情况下这个基类部分在B对象的开始位置,而如果是非trivial的继承关系的话就可能非常复杂。
还是建议去看看《深度探索》那本书。

AngelWing00 2005-09-09
  • 打赏
  • 举报
回复
呵呵,本人莱鸟一个,不过说说自己的看法:
A *a=new B;
a不能调用到B中的同名成员函数,其实是因为C++里的"隐藏"机制在作怪,
因为没有使用虚函数,所以这里就不存在多态了,取而代之的是隐藏,可以参看<高质量C++编程>
class A
{
public:
virtual void f(float x) { cout<<"A-f"<<endl;}
void h(float x) { cout<<"A-h"<<endl;}
};

class B : public A
{
public:
virtual void f(float x) { cout<<"B-f"<<endl;}
void h(float x) { cout<<"B-h"<<endl;}
};

void main(void)
{
B b;
A *pa=&b;
B *pb=&b;

pa->f(3.14); //B-f
pb->f(3.14); //B-f

pa->h(3.14); //A-h
pb->h(3.14); //B-h
}
xlsue 2005-09-09
  • 打赏
  • 举报
回复
要很好的回答美女的问题。几乎涉及到《inside the c++ object model》半本书:)
djh001 2005-09-09
  • 打赏
  • 举报
回复
自古英雄难过美人关呐!
zwlzwlzwl 2005-09-09
  • 打赏
  • 举报
回复
vtable中B中除了有自己的方法外,还有指向基类的vtable的指针,A *a =new B,中编译时A中存放了指向B对象的指针,运行时,根据动态绑定原理执行B中的方法
icecools 2005-09-09
  • 打赏
  • 举报
回复
照片呢?
yjh1982 2005-09-09
  • 打赏
  • 举报
回复
照片呢?
djfu 2005-09-09
  • 打赏
  • 举报
回复
哈哈,潜力贴。
hbyufan 2005-09-09
  • 打赏
  • 举报
回复
我也谈谈我的看法哦:
-------------------------

class A class B :class A

A *a=new B;
////
a 里所放的内容是不是B类型对像的地址? 我回答是 (请指证)
---------------------------------------------------------------------------------------
RE:
推测:我也认为,指针a中存放的内容是B类型对象的地址 .
理由:B是A的子类,在构造B类对象的时候,调用B类构造函数前先调用了A类构造函数,在内存模型上B类对象与A类对象是一致的,所以当 A *a=new B 的时候,编译器自动进行了类型转换.a指向B对象首地址.
---------------------------------------------------------------------------------------
////
那么a 为什么不能用B中的成员? 我回答: 这是归定. 她用讽刺的眼光看着我.

--------------------------------------------
RE:
回答:a 可以调用B中的成员函数,但不能调用B中的数据成员.
现象:
1,a 是A类型指针,A构造函数先于B构造函数已经调用,a当然可以访问类A中public成员函数和成员数据(如果a 在B类中调用,还可以访问到A类的protected成员,a在外部调用,只可访问A中public成员).
2,a 还可以访问B类中成员函数(在外部调用,只能调用B中public成员函数).
a是指向B对象的,可以访问B对象成员函数.成员函数的入口地址都是两个字节(16位机中).
3,a 不可以访问B类中的数据成员.如果通过a来修改B类的数据成员(public),会遇到问题.
a是A类指针,不知道B类数据成员的数据类型,访问时候不做类型转换当然出错.
概括:a除了不可用来访问B类数据成员外,可以当成B类指针来使用.

--------------------------------------------
注意:上为现在的推测,上网没法调试,回去再实践实践.关注的朋友,注意我的跟贴哦.
--------------------------------------------

理由:查找中...(盼忘高手指点).
--------------------------------------------
如果,不用到虚拟函数的情况下, 这样的语句是不是 一点意义也没有? 如果有,那有什么应用呢?

我想说没意义, 但是没说. 但要说有,我也想不出有啥应用.

都怪我基楚没学好. 555555555555
--------------------------------------------
RE:
应用还是有的吧. bfbd(八风不动) (
--------------------------------------------
bfbd 2005-09-08
  • 打赏
  • 举报
回复
举个简单的例子:

你有一大堆的B,一大堆的C,还有一大堆的D,捎带着还有几个A,
其中B,C,D统统继承于A,你想把这几大堆东西放到一块儿,怎么办?

这时的关键就在于对A的继承。
你可以用链表,Map或指针数组等存储几大堆指向A的指针,
但实际上这些指针并非都指向A类对象,
有的指向B,有的指向C,还有的指向D。
于是你就可以对这几大堆东西统一处理了。

明白了吧,就这用,谁敢说没用?
zhousqy 2005-09-06
  • 打赏
  • 举报
回复
复习一下
ply168 2005-09-06
  • 打赏
  • 举报
回复
HO HO HO 看来大家都是好色之徒啊!
aiguozhou 2005-09-06
  • 打赏
  • 举报
回复
mark
laomai 2005-09-06
  • 打赏
  • 举报
回复
呵呵没,一说美女饼子们全出来了
xlsue 2005-09-06
  • 打赏
  • 举报
回复
"指针类型" 只是教导编译器如何解释某个特定地址中的内容及其大小。单一继承如此,多重继承(使用第二个基类指针来指向派生类对象,需要调整地址),虚拟继承也需要调整。
不使用虚拟函数,上面那个例子意义不大。
blackcrusoe 2005-09-06
  • 打赏
  • 举报
回复
a 里所放的内容是不是B类型对像的地址?
单继承的情况下一般编译器的实现确实是如此。

那么a 为什么不能用B中的成员?
显示的使用B中成员会被编译器阻止,通过欺骗编译器也可以使用B中的成员,但这样作一般是不可移植的。

如果不用到虚拟函数的情况下, 这样的语句是不是 一点意义也没有
大多数情况下是一点意思也没有。因为类=数据+行为,子类和父类是一般和特殊的关系,如果A和B的行为一样(没有虚函数),那就没必要区分A和B。
qingyuan18 2005-09-05
  • 打赏
  • 举报
回复
A *a=new B;
此时如果A,B中的成员函数同名,而又调用a的函数方法,则肯定会去找A的成员函数,因为a是A*的指针,但是a中存放的又是B的地址,这很让人混淆。

所以建议基类与子类的方法如果确实需要这样调用的话,应将基类中的方法定义为vitual,在子类中实现(这有点像java的接口)。

yndfcd 2005-09-05
  • 打赏
  • 举报
回复
本来不想说的,不过看在美女的份上,还是说两句。

a 里所放的内容是不是B类型对像的地址? 我回答是 (回答"是"是正确的)
那么a 为什么不能用B中的成员?(a可以调用B中的成员,但是需类型转换)

果,不用到虚拟函数的情况下, 这样的语句是不是 一点意义也没有(是,就是一点意思也没有,如果不用到虚函数,这样做是自讨苦吃).
加载更多回复(48)

64,637

社区成员

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

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