我刚刚在一个上下文中遇到了using-directive,这对我来说是新的 - 例如将父类的成员从一个私有“移动”到私有。我测试了下面的例子,出现了两个问题:
代码格式错误
class A{
public:
A():_i(1975){}
int _i;
};
class B : public A
{
public:
B():_i(333){}
int i()const{ return _i;}
private:
int _i; // (1)depricated? no warning in VS2008?
};
class C : public A
{
public:
C(){} //_i initialized by A
int i()const{ return _i+1;}
private:
using A::_i; //(2) should be the right way
};
int main()
{
B b;
int i= b.i(); //value of B::_i (333)
int a_i = static_cast<A*>(&b)->_i; //value of A::_i (1975)
C c;
int ca_i = c.i(); //value of A::_i via getter (1975+1)
//however, A::_i is still accessible
a_i = static_cast<A*>(&c)->_i; //value of A::_i (1975)
return 0;
}
答案 0 :(得分:1)
ad(1):我认为不应该弃用这个原因。我认为这是完全合法的C ++。 (班级B
添加了_i
的第二个副本,该副本会隐藏_i
中的A
,但您仍然可以通过b.A::_i
访问后者。)
ad(2):这对我来说似乎没用,因为您仍然可以使用_i
访问c
中的c.A::_i
,因此根本不会隐藏
答案 1 :(得分:1)
然而,丑陋的代码对我而言......(只是审美人格感觉还好)。
不是隐藏会员。这是添加的成员。
此代码中有两个i
。 A::_i
和B::_i
。
之后可以玩。但是,当代码以这种方式误导时,我真的不喜欢。
答案 2 :(得分:1)
为了您的娱乐,GotW关于C ++隐藏功能的讨论: - )