首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++函数隐藏的一个的有关问题

2013-08-24 
c++函数隐藏的一个的问题#includeiostreamusing namespace stdclass aa{public:void func(){cout基

c++函数隐藏的一个的问题

#include<iostream>
using namespace std;
class aa
{
public:
void func(){cout<<"基类的func函数"<<endl;};
void you(double x){cout<<x<<endl;func();}
};

class bb : public aa
{
public:
void func(){cout<<"子类的func函数"<<endl;}
};
int main()
{
bb b;
b.you(50.5);//调用从父类继承来的函数,输出结果却是 基类的func函数,没有体现隐藏原则啊
b.func();//直接调用func,这里体现了隐藏原则吧
}

求高手帮我分析一下,第18行是怎么调用父类的func()函数的,或者用函数查找的有关知识帮我解释一下 C++ 隐藏 查找
[解决办法]
这个例子证明隐藏不是一种好的设计(作为失败的典型,你很成功)
还是用覆盖/动态绑定好。
#include<iostream>
using namespace std;
class aa
{
public:
       //make it virtual
virtual void func(){cout<<"基类的func函数"<<endl;};
void you(double x){cout<<x<<endl;func();}
};

class bb : public aa
{
public:
void func(){cout<<"子类的func函数"<<endl;}
};
int main()
{
bb b;
b.you(50.5);//调用从父类继承来的函数,输出结果却是 基类的func函数,没有体现隐藏原则啊
b.func();//直接调用func,这里体现了隐藏原则吧
}

[解决办法]
普通函数的调用是编译时就确定的,基类中的you函数调用的是基类的func函数

[解决办法]
引用:
这个例子证明隐藏不是一种好的设计(作为失败的典型,你很成功)
还是用覆盖/动态绑定好。
#include<iostream>
using namespace std;
class aa
{
public:
       //make it virtual
virtual void func(){cout<<"基类的func函数"<<endl;};
void you(double x){cout<<x<<endl;func();}
};

class bb : public aa
{
public:
void func(){cout<<"子类的func函数"<<endl;}
};
int main()
{
bb b;
b.you(50.5);//调用从父类继承来的函数,输出结果却是 基类的func函数,没有体现隐藏原则啊
b.func();//直接调用func,这里体现了隐藏原则吧


}



++ 说到重点啦!
[解决办法]
you(double x){cout<<x<<endl;func();}是基类函数,函数中又调用func()函数,不可能从基类调用子类函数形成跨越吧。函数调用一般都是向上调用,无法也没必要向下调用
[解决办法]
1楼给你很好的解释了
[解决办法]
因为子类会继承所有父类的函数,如果存在函数同名则会覆盖或者重写。因此你的you其实调用了父类的。

热点排行