请教:这个结果程序运行后正确的显示什么??

kpman 2009-03-03 11:27:17
#include <stdio.h>

class B0
{
public:
void display()
{
printf("B0:display()\n");
}
};

class B1:public B0
{
public:
void display()
{
printf("B1:display()\n");
}
};

class D1:public B1
{
public:
void display()
{
printf("D1:display()\n");
}
};

void fun(B0 *ptr)
{
ptr->display();
}

int main()
{

B0 b0;
B1 b1;
D1 d1;
B0 *p;

p = &b0;
fun(p);

p=&b1;
fun(p);

p = &d1;
fun(p);

return 0;
}
...全文
100 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kpman 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lightnut 的回复:]
引用 9 楼 kpman 的回复:
.....
但是书本上说的却是这个 以我的理解也是这个才对。。可是结果却上面的哪个。。
B0:display()
B1:display()
D1:display()

要得到这个结果, B0::display()必须是虚函数:
class B0
{
public:
virtual void display()
{
printf("B0:display()\n");
}
};
[/Quote]

为什么 这样就可以呢。。不明白。。
yangch_nhcmo 2009-03-03
  • 打赏
  • 举报
回复

#include <stdio.h>

class B0
{
public:
void display()
{
printf("B0:display()\n");
}
};

class B1:public B0
{
public:
void display()
{
printf("B1:display()\n");
}
};

class D1:public B1
{
public:
void display()
{
printf("D1:display()\n");
}
};

void fun(B0 *ptr)
{
ptr->display();
}

int main()
{

B0 b0;
B1 b1;
D1 d1;
B0 *p;

p = &b0;
fun(p);//没有虚函数,p指向由其类型决定,即p指向B0

p=&b1;
fun(p);//同上

p = &d1;
fun(p);//同上


return 0;
}
jakqigle 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 flameearth 的回复:]
B0:display()
[/Quote]

这个是什么目的啊?
要多态也没有virtual基类的display()啊!
夹心饼干 2009-03-03
  • 打赏
  • 举报
回复
都是B0:display(),因为你没有在基类里重写display函数,
在对象建立的时候,都会从基类做入口,没有定义成虚函数就不会对派生的func重写

就是用了虚函数,这个fun函数里的参数要改成引用才能够区分
flameearth 2009-03-03
  • 打赏
  • 举报
回复
B0:display()
  • 打赏
  • 举报
回复
void fun(B0 *ptr)
{
ptr->display();
}

传入的参数都呗截至到基类部分,display则为基类作用域的拿个.
太乙 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lightnut 的回复:]
都是B0:display()
[/Quote]

yes!在编译连接之后,函数入口地址就确定了,而不是在运行的时候确定的!
lightnut 2009-03-03
  • 打赏
  • 举报
回复
都是B0:display()
Laozql 2009-03-03
  • 打赏
  • 举报
回复
这个程序又没有什么虚函数之类的,该显示什么就显示什么呗,自己调试去
sanguomi 2009-03-03
  • 打赏
  • 举报
回复
静态绑定和动态绑定的区别,你要达到书上的结果,得声明虚函数才可以的
lightnut 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kpman 的回复:]
.....
但是书本上说的却是这个 以我的理解也是这个才对。。可是结果却上面的哪个。。
B0:display()
B1:display()
D1:display()
[/Quote]
要得到这个结果, B0::display()必须是虚函数:
class B0
{
public:
virtual void display()
{
printf("B0:display()\n");
}
};
kpman 2009-03-03
  • 打赏
  • 举报
回复
运行后的正确的是这个
B0:display()
B0:display()
B0:display()

但是书本上说的却是这个 以我的理解也是这个才对。。可是结果却上面的哪个。。
B0:display()
B1:display()
D1:display()

65,211

社区成员

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

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