2012-04-22 63 views
1

我有这样的代码片段C++继承与访问修饰符

#include <iostream> 
    using namespace std; 
    class Polygon 
    { 
     public: 
      int publicmemberPolygon; 
     private: 
      int privatememberPolygon; 
     protected: 
      int protectedmemberPolygon; 
    }; 

    class Square : public Polygon 
    { 
    public: 
     int Getter(); 
    }; 
    int Square::Getter() 
    { 
    return privatememberPolygon; 
    } 

    int main() 
    { 
    } 

的问题是,为什么privatememberPolygon是inaccesbile?是不是,当你有一个精致的类时,它的所有成员/函数都被复制了?谢谢

回答

3

不,您从基类公开派生时,只有其publicprotected成员可以访问派生类。您也可以阅读这FAQ

见这个例子:

class Base 
{ 

public: 
    void setPrivate(int p) 
    { 
     m_private = p; 
    } 

public: 
    int m_public; 
protected: 
    int m_protected; 
private: 
    int m_private; 
}; 

class Derived : public Base 
{ 
public: 
    void f() 
    { 
     m_public = 0; // Can access public member of base class 
     m_protected = 0; //Can access protected member of base class 
     m_private = 0; //Compiler error- Can not access private member of base class 
    } 
}; 

int main() { 

    Derived d; 
    d.setPrivate(10); //m_private is still part of the derived class. Hence can call setPrivate 
    return 0; 

} 
+0

我不明白,嗯,当我们说继承,基类的所有成员/功能被复制到子类正确? – WantIt 2012-04-22 03:16:01

+0

还是只有公共和受保护的成员自动“复制”到该新的派生类? – WantIt 2012-04-22 03:17:24

+0

它取决于访问说明符。 – 2012-04-22 03:17:32

2

只有公众和受保护的数据成员在继承访问,当你继承公开。

2

成员不会“复制”到派生类中。派生类包含基类的子对象,几乎与有成员变量的子对象相同。

事实上,组成和非公有继承通常被认为是解决同一问题的两条途径。

带有非公有继承的一个微不足道的区别是基础子对象的成员不必通过对象名称来找到它们,它们是其中的一部分(除非你有钻石继承, !)。对于公共继承,还有一个从派生类的指针或引用到基类的指针或成员的隐式转换。

更大的区别是继承允许覆盖虚拟功能,而组合不允许。

protected成员(和碱基)在最终分析中实际上是无用的,因为它们抑制组成而没有像virtual那样提供真正的益处。有时他们在虚拟函数已经使继承成为必要时使用。