谁能给我解释一下这里的应用..
class B{
protected:
void f1() { }
};
class D : private B{
public:
using B::f1;
};
int main()
{
D d1;
d1.f1();
}
上面的程序很正常.为什么D私有继承B还可以把B::f1放在public区呢?
这不是把B::f1的使用级别提升了吗?那前面的private的派生限制有什么意义呢?
问题点数:20、回复次数:9Top
1 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:23:11 得分 10
这里有 using 名空间 这个f1是B里面的 不是自己继承而来的。尽管是一样。
想象一下 在D里面重载了f1(), 这样就比较好理解一些了
using namespace std;
class B{
protected:
void f1() {cout<<"B"<<endl; }
};
class D : private B{
public:
using B::f1;
void x(){fi();}
private:
void fi(){cout<<"C"<<endl;}
};
int main(int argc, char* argv[])
{
D d1;
d1.f1();
d1.x();
return 0;
}
Top
2 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:24:35 得分 0
不好意思 不是重载 是覆盖Top
3 楼comebaby(游民)回复于 2004-09-04 03:26:10 得分 0
问:using B::f1是什么意思??Top
4 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:38:34 得分 0
protected 就是意味着 对于自己 象private 而对于派生类就象public
using B::f1;能够被d调用就很正常了 因为f1正好说明了这个特性 这里不存在级别提升,放在public里就相当于调用了基类的protected
如果没有 using B::f1;的话,d将不能调用任何函数。因为全部都是private。
如果直接写:
public:
void f1(){};
这就变成覆盖了
Top
5 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:39:53 得分 0
问:using B::f1是什么意思??
使用名空间 表示这里的f1是B里面的Top
6 楼ntxs(别人加薪我加班,数钱数到心发酸T_T)回复于 2004-09-04 03:47:25 得分 10
不好意思 我粗心把f1写成了fi 代码有错误。 这里不能覆盖,会产生二义性。
#include <iostream>
using namespace std;
class B{
protected:
void f1() {cout<<"B"<<endl; }
};
class D : private B{
public:
using B::f1;//调用B里面的f1
void x(){f1();}//调用自己继承来的f1
private:
};
int main(int argc, char* argv[])
{
D d1;
d1.f1();//可直接调用B里的保护成员
d1.x();//间接调用自己的私有成员
return 0;
}Top
7 楼EffectiveCpp(我当老板时不会忘记各位的)回复于 2004-09-04 17:46:47 得分 0
using B::f1;能够被d调用就很正常了 因为f1正好说明了这个特性 这里不存在级别提升,放在public里就相当于调用了基类的protected
//是的,对于派生类而言基类的protected相当于public的,但它是private继承.
//那就是讲基类的不管是public,protected成员都相于派生类中的私有成员呀.
//所以如果可以把一个私有成员用using 的方式提升到public层,那么似乎可以这样:
class D{
pubic:
using D::f1;
private:
void f1();
};
但我们知道这样是不对的.
我觉得我的推理似乎合理...
还有一个问题,
同时用using B::f1;和void f1(){}在public中.
为什么不产生二义性?它们又没有重载...为什么说自己定义的f1覆盖了using B::f1?
在D中的private中定义了一个f1()为什么是覆盖了public中的using B::f1?Top
8 楼EffectiveCpp(我当老板时不会忘记各位的)回复于 2004-09-04 23:14:09 得分 0
upTop
9 楼EffectiveCpp(我当老板时不会忘记各位的)回复于 2004-09-05 22:55:58 得分 0
Anybody?Top




