使其中一个继承的受保护成员成为私有

Kod*_*ior 5 c++ inheritance

class A
{
protected:
    int m_a;
    int m_b;
};

class B: public A
{
};
Run Code Online (Sandbox Code Playgroud)

在B级我想m_a私人.以下是正确的方法吗?

class B:public A
{    
private:
    int m_a;
};
Run Code Online (Sandbox Code Playgroud)

这不会导致2份副本m_a吗?

eca*_*mur 5

调整成员访问控制的正确方法是使用using声明:

class B: public A {    
private:
    using A::m_a;
}
Run Code Online (Sandbox Code Playgroud)

只是写作int m_a;确实会产生两个副本m_a,派生类将能够通过写入来访问A副本.m_aA::m_a

  • @AlexanderTobiasHeinrich没有一个符合标准的编译器; 参见例如http://liveworkspace.org/code/9ac3b1e42038bdd8cb5662fff0aa5753 (2认同)
  • 俗话说,“防范墨菲,而不是马基雅维利”。如果一个类客户端成功地使用`A::m_a` 绕过了保护措施并且事情出错了,好吧,只是沙漠。 (2认同)

jua*_*nza 2

阴影m_a中的。它是一个不同的数据成员,因此 B 类实际上具有三个: , 和。私有访问in的方法是私有地“使用” in :class B class AintsA::m_aA::m_bB::m_am_aBA::m_aclass B

class A {
  int m_a;
};

class B:  public A {    
    using A::m_a;
};

class C : public B {
  void foo() { 
    m_a++; // ERROR!
  }
};
Run Code Online (Sandbox Code Playgroud)