| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 600 人关注过本帖
标题:这几天学习c++的总结-->c++论坛第一帖
只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
结帖率:95.74%
收藏
 问题点数:0 回复次数:4 
这几天学习c++的总结-->c++论坛第一帖
程序代码:
#include <iostream>

using namespace std;

class Father
{
    public:
    void eat()
    {
        cout<<"父亲喜欢吃米饭"<<endl;
    }
    void smoking()
    {
        cout<<"喜欢抽烟"<<endl;
    }
    private:
    int weight;
    int age;
};

class Son :public Father
{
    public:
    void eat()
    {
        cout<<"儿子喜欢吃粉"<<endl;
    }
};
int main()
{
    Son s;
    s.eat();
    return 0;
}

输去: 儿子喜欢吃粉  
这里只是输去子类eat 而父亲的eat 到哪里去了呢!
父亲的子类被儿子的隐藏了。你可以把 s.eat(); 换成 s.Faher::eat();显示调用父类的eat;
就算你你把子类的eat()  换成 eat(int); 然后在
int main()
{
    Son s;
    s.Father::eat(1);
    s.eat();
    return 0;
}

会发生编译错误。

说你s.eat() 不能添加参数.
说明你不能调用父类的eat 你改成s.Father::eat(); 就可以了。
这就是隐藏了。

-----------------------------------------------------------
父类 和子类的内存模型

父类: 父类
子类:  父类 + 子类外加部分

他们首地址是一样的。
可以通过
#include <iostream>

using namespace std;

class Father
{
public:
    void eat()
    {
        cout<<"父亲爱吃米饭"<<endl;
    }

    void show()
    {
        cout<<"父亲内存地址:"<<this<<endl;
    }
};

class Son:public Father
{
public:
    void eat()
    {
        cout<<"儿子爱吃粉"<<endl;
    }
    void show1()
    {
        cout<<"儿子内存地址:"<<this<<endl;
    }
};


int main()
{
    Son s;
    s.show1();
    s.show();
    return 0;
}


儿子内存地址:0012FF7C
父亲内存地址:0012FF7C
Press any key to continue

如果你把Main 改成下面
int main()
{
    Son s;
    Father *pF;
    pF = &s;
    pF->eat();
    return 0;
}

输去结果会是下面
父亲爱吃米饭
Press any key to continue
为什么会这样呢!! 把一个子类地址传递给父类指针可以调用成功呢!

我来说明一下:
1: 静态绑定 和run-time(运行)绑定。
静态绑定:在编译的时候就确定好了关系, 确定好了你要调用哪个函数,
就像c 语言中的数组大小是在编译的时候就确定 ,是不能够动态改变大小的。
静态编译是通过你的数据类型来来确定的,就像sizeof() 来判断大小是根据你定义的数据类型来判断你的大小。如果你强制转换把一个类型转换另一个类型的时候,可以骗过编译器但你运行的时候就会报错。
动态编译:
根据你给他对象的类型来确定的。。。

2:这里就要用用到子类和父类的首地址一样。
可以说父类的前面部分和子类的部分相同 你真好用的父类指针 所以偏移量是一样的 所以这样才会真好调用父类eat();

这里指针不一样偏移量是不一样的。。

int main()
{
    Son s;
    Father f;
    Son *pS = (Son *)&f;
    pS->eat();

    return 0;
}
也可以通过这个上面的函数反正明那个事实




搜索更多相关主题的帖子: color 
2012-02-24 01:05
长江浪打浪
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-2-24
收藏
得分:0 
看不懂 目前
2012-02-24 19:09
zbh160
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-9-2
收藏
得分:0 
谢谢楼主分享~
2012-02-26 09:34
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
···

用心做一件事情就这么简单
2012-02-26 12:28
lopezzeng
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-7-15
收藏
得分:0 
有帮助,涉及到内存和编译的知识
2012-07-21 10:47
快速回复:这几天学习c++的总结-->c++论坛第一帖
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017991 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved