回 帖 发 新 帖 刷新版面

主题:继承 虚函数

刚学了继承的,找了道习题来做下,可是一看却完全弄不明白,希望会的帮我分析下,小弟谢谢了 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个回复)

沙发


http://blog.163.com/yql_bl/blog/static/84785169200894115750448/edit/虚函数探究  看看吧对你有用

板凳


[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 楼

真郁闷,怎么会显示出 [font=Comic Sans MS] 这段乱码?
不过没有改变原来的代码,只是对阅读有点不利

4 楼


谢谢楼上的兄弟了  呵呵

5 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册