C++的protected继承
高洛峰
高洛峰 2017-04-17 11:20:16
0
3
708

保护继承(protected)

保护继承与私有继承相似,基类成员对其对象的可见性与一般类及其对象的可见性相同,public成员可见,其他成员不可见。

基类成员对派生类的可见性,对派生类来说,基类的public和protected成员是可见的:基类的public成员和protected成员都作为派生类的protected成员,并且不能被这个派生类的子类所访问;基类的private成员是不可见的:派生类不可访问基类中的private成员。

基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

所以,在保护继承时,基类的成员也只能由直接派生类访问,而无法再向下继承。

上面这个是不是有问题

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(3)
PHPzhong

protoected繼承時, 基底類別的public成員和protected成員都可以被衍生類別的子類別存取。這個確實有問題。
最簡單的驗證方法就是實踐了。

伊谢尔伦

沒看懂這麼一段話繞的什麼意思,如果是書,建議樓主換一本書看

繼承的可見性是變小的,也就是 protected繼承,會將public變成protected,protected和private不變。
基底類別的衍生類別只要不是private繼承的,那麼衍生類別的衍生類別也是可以存取到基底類別的非private屬性的

左手右手慢动作

這個問題,我也想問

%%%C++資料結構的部分程式碼

class const_iterator

    {
        public:
            const_iterator() :current( NULL )
            { }            
            const Object & operator*() const
            {
                return retrieve();
            }    
            const_iterator & operator++()
            {
                current = current->next;
                return *this;
            }    
            const_iterator operator++(int)
            {
                const_iterator old =*this;
                ++(*this);
                return old;
            }            
            bool operator ==(const const_iterator &rhs) const
            {
                return current == rhs.current;
            }
            bool operator != (const const_iterator &ths) const
            {
                return !(*this == ths);
            }                
        protected:
            Node * current;
            **Object & retrieve() const**
            {
                return current->data;
            }    
            const_iterator(Node *p): current(p)
            {  }    
            friend class List<Object>;
    };
    
    class iterator : public const_iterator
    {
        public:
            iterator( )
            { }
            Object & operator*()
            {
                **return retrieve();**
            }
            const Object &operator* () const
            {
                return const_iterator::operator*();
            }
            iterator & operator++()
            {
                current = current->next;
                return *this;
            }
            iterator operator++ (int)
            {
                iterator old =*this;
                ++(*this);
                return old;
            }
        protected:
            iterator(Node *p) :const_iterator( p)
                { }
            friend class List<Object>;
    };
    

在利用dev-C++進行編譯出現以下錯誤:

In member function 'Object& List<Object>::iterator::operator*()':
[Error] there are no arguments to '**retriev**e' that depend on a template parameter, so a declaration of 'retrieve' must be available [-fpermissive]
[Error] there are no arguments to 'retrieve' that depend on a template parameter, so a declaration of 'retrieve' must be available [-fpermissive]

類別 iterator 繼承自const_iterator ,但是在iterator中似乎並不能呼叫const_iterator中protected中的內容?

這段程式碼 ,摘自《資料結構與演算法分析C++描述》第三版,Mark Allen Weiss著。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板