主题:继承 虚函数
pirol21
[专家分:0] 发布于 2008-11-20 02:43:00
刚学了继承的,找了道习题来做下,可是一看却完全弄不明白,希望会的帮我分析下,小弟谢谢了 O(∩_∩)O
#include <iostream>
using namespace std;
class aa{
public:
virtual void f(){cout<<"aa"<<endl;}
};
class bb:public aa{
public:
bb(){cout<<"bb"<<endl;}
};
class cc:public bb{
public:
virtual void f(){bb::f();cout<<"cc"<<endl;}
};
int main()
{
aa a,*p;
bb b;
cc c;
p=&c;
p->f();
return 0;
}
回复列表 (共5个回复)
沙发
coolwater2008 [专家分:720] 发布于 2008-11-20 07:21:00
http://blog.163.com/yql_bl/blog/static/84785169200894115750448/edit/虚函数探究 看看吧对你有用
板凳
irunzhen [专家分:10] 发布于 2008-12-07 10:22:00
[quote]
[font=Fixedsys][color=#0000FF]#include [/color][color=#FE2727]<[/color][color=#000600]iostream[/color][color=#FE2727]>
[/color][color=#0000FF]using namespace [/color][color=#000600]std[/color][color=#FE2727];
[/color][color=#0000FF]class [/color][color=#000600]aa
[/color][color=#FE2727]{
[/color][color=#0000FF]public[/color][color=#FE2727]:
[/color][color=#0000FF]virtual void [/color][color=#000600]f[/color][color=#FE2727]()
{[/color][color=#000600]cout[/color][color=#FE2727]<<[/color][color=#808080]"aa"[/color][color=#FE2727]<<[/color][color=#000600]endl[/color][color=#FE2727];}
};
[/color][color=#0000FF]class [/color][color=#000600]bb[/color][color=#FE2727]:[/color][color=#0000FF]public [/color][color=#000600]aa
[/color][color=#FE2727]{
[/color][color=#0000FF]public[/color][color=#FE2727]:
[/color][color=#000600]bb[/color][color=#FE2727]()
{[/color][color=#000600]cout[/color][color=#FE2727]<<[/color][color=#808080]"bb"[/color][color=#FE2727]<<[/color][color=#000600]endl[/color][color=#FE2727];}[/color][/font][font=Comic Sans MS][color=#008000]//这是构造函数,随着bb类对象的创建而调用
[/color][/font][font=Fixedsys][color=#FE2727]};
[/color][color=#0000FF]class [/color][color=#000600]cc[/color][color=#FE2727]:[/color][color=#0000FF]public [/color][color=#000600]bb
[/color][color=#FE2727]{
[/color][color=#0000FF]public[/color][color=#FE2727]:
[/color][color=#0000FF]virtual void [/color][color=#000600]f[/color][color=#FE2727]()
{
[/color][color=#000600]bb[/color][color=#FE2727]::[/color][color=#000600]f[/color][color=#FE2727](); [/color][/font][font=Comic Sans MS][color=#008000]//f()是从aa继承的,打印“aa”
[/color][/font][font=Fixedsys][color=#000600]cout[/color][color=#FE2727]<<[/color][color=#808080]"cc"[/color][color=#FE2727]<<[/color][color=#000600]endl[/color][color=#FE2727];
}
};
[/color][color=#0000FF]int [/color][color=#000600]main[/color][color=#FE2727]()
{
[/color][color=#000600]aa a[/color][color=#FE2727],*[/color][color=#000600]p[/color][color=#FE2727];[/color][/font][font=Comic Sans MS][color=#008000]//创建 a对象,*p指针
[/color][/font][font=Fixedsys][color=#000600]bb b[/color][color=#FE2727];[/color][/font][font=Comic Sans MS][color=#008000]//调用bb类的构造函数
[/color][/font][font=Fixedsys][color=#000600]cc c[/color][color=#FE2727];
[/color][color=#000600]p[/color][color=#FE2727]=&[/color][color=#000600]c[/color][color=#FE2727];
[/color][color=#000600]p[/color][color=#FE2727]->[/color][color=#000600]f[/color][color=#FE2727]();[/color][/font][font=Comic Sans MS][color=#008000]//由于cc中有了f()函数,与virtual f() 重复,所以这里应该是函数的重载
//只调用自己有的,不用继承来的
[/color][/font][font=Fixedsys][color=#0000FF]return [/color][color=#800080]0[/color][color=#FE2727];
}
[/color][color=#000000]答案:
[/color][color=#000600]bb[/color][/font][font=Comic Sans MS][color=#008000]// b的构造函数调用的结果
[/color][/font][font=Fixedsys][color=#000600]bb[/color][/font][font=Comic Sans MS][color=#008000]//c对象创建时,先创建他所继承的bb类对象b,而b创建时会调用构造函数bb()打印bb
[/color][/font][font=Fixedsys][color=#000600]aa[/color][/font][font=Comic Sans MS][color=#008000]//bb::f()
[/color][/font][font=Fixedsys][color=#000600]cc[/color][/font][font=Comic Sans MS][color=#008000]//cout<<"cc"<<endl
[/color][/font][/quote]
3 楼
irunzhen [专家分:10] 发布于 2008-12-07 10:25:00
真郁闷,怎么会显示出 [font=Comic Sans MS] 这段乱码?
不过没有改变原来的代码,只是对阅读有点不利
4 楼
pirol21 [专家分:0] 发布于 2008-12-08 21:50:00
谢谢楼上的兄弟了 呵呵
5 楼
moke9 [专家分:30] 发布于 2010-09-02 07:55:00
你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846
我来回复