slicing(给你我能的最高)

goldboya 2002-12-24 09:46:26
class base{
public:
virtual int a();
};
class derive{

public:
virtual int a();
};

main()
{
derive d();
base b=d;
b.a();//调用的是base::a()吧。为什么?
}
...全文
47 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
davidchen1219 2002-12-24
  • 打赏
  • 举报
回复
只有by reference或者by pointer形式才能实现动态联编.
goldboya 2002-12-24
  • 打赏
  • 举报
回复
sorry sorry 是
class derive: public base{
...
};
我的意思是base b=d;
这是有切割。
---------
一开始d的vptr志向vtbl, 而vtbl有derive::a();
但是当b=d(赋值)后,b的vptr的值是d的vptr吗?如果是,那么b 的vtbl是derive::a();然而调用b.a();是base::a();(是吗?);
问题就是:怎样使得b获得他自己的a()(base::a();
Accelerator 2002-12-24
  • 打赏
  • 举报
回复
有点笔误,base *b=d应该写成base *b=&d
Accelerator 2002-12-24
  • 打赏
  • 举报
回复
首先我想说的是你的语句可能没有表达清楚,大概你的原意是从base类中派生出derive类,但是何处表明了派生和继承呢?如果我理解错了你的意思,b=d又是什么意思呢?
误会放在一边。b已经被定义为base的一个实例(instance),因为并没有定义为指针,所以你的虚函数不会在这里起作用。如果我们这样定义:base *b=d。那么语句b->a()就会调用derive::a()。
记住,是用指针。
jsyy 2002-12-24
  • 打赏
  • 举报
回复
你都没有继承关系,何来的多态???
J2eeLearner 2002-12-24
  • 打赏
  • 举报
回复
base b=d; //up-cast
b.a();//调用的是base::a()吧。为什么?


如果你想让多态好用
base &b=d;
goldboya 2002-12-24
  • 打赏
  • 举报
回复
这里如何体现切割
songhonda 2002-12-24
  • 打赏
  • 举报
回复
base b=d;这一句中,由于b声明的是base对象,所以其vptr指向的是base::a(),但是如果base *b=&d,根据多态的原则,b的vptr则指向derive::a()
goldboya 2002-12-24
  • 打赏
  • 举报
回复
这里不是值拷贝吗?
请从内部过程给个说明。谢谢了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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