C ++:隐藏子类中的成员。是否有意义?

时间:2010-11-04 09:10:29

标签: c++ oop

我刚刚在一个上下文中遇到了using-directive,这对我来说是新的 - 例如将父类的成员从一个私有“移动”到私有。我测试了下面的例子,出现了两个问题:

  1. (1)的代码是否可移植?根据标准,它应该被弃用。
  2. 将子公共成员隐藏在子类中是否有意义? (我认为在Java中,子类的访问权限可能不那么严格。)
  3. 代码格式错误

    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;
    }
    

3 个答案:

答案 0 :(得分:1)

ad(1):我认为不应该弃用这个原因。我认为这是完全合法的C ++。 (班级B添加了_i的第二个副本,该副本会隐藏_i中的A,但您仍然可以通过b.A::_i访问后者。)

ad(2):这对我来说似乎没用,因为您仍然可以使用_i访问c中的c.A::_i,因此根本不会隐藏

答案 1 :(得分:1)

然而,丑陋的代码对我而言......(只是审美人格感觉还好)。

不是隐藏会员。这是添加的成员。 此代码中有两个iA::_iB::_i

之后可以玩。但是,当代码以这种方式误导时,我真的不喜欢。

答案 2 :(得分:1)

为了您的娱乐,GotW关于C ++隐藏功能的讨论: - )