多态性和受保护的继承问题

Posted

技术标签:

【中文标题】多态性和受保护的继承问题【英文标题】:polymorphism and protected inheritance issue 【发布时间】:2016-03-05 12:10:31 【问题描述】:

我有这个代码,并且在行中 tp = new asp_table,它不会让我编译说我没有访问权限。 我不明白为什么?我试图创建一个从基类到派生类的指针,但它不允许我这样做。我想知道为什么。

class table     
    int size;     
    int priority;   

    public:       
    table(int s=0,int p=0):size(s),priority(p) 
    virtual void print()
;

class stud_table:public table    
    char * name;  
    int gr;

    public: 
    void print() cout<<"students table"<<endl;  
    ~stud_table() delete []name; 
;

class asp_table:protected table  
    char* thesis;
; 

int main()   
    stud_table st;   
    table * tp = &st; 
    tp = new asp_table;
    stud_table * stp = &st;   
    cout<<"Program"<<endl;    
    return 0;
 

【问题讨论】:

访问什么?请在您的问题中添加完整的错误消息。 错误:不允许转换为无法访问的基类“表”。 【参考方案1】:

错误信息说明了一切:

无法将“asp_table”转换为其受保护的基类“表”

protected 继承意味着只有asp_table 及其派生类知道继承。因此tp = new asp_table 在类或其派生类之外是不可能的。

【讨论】:

非常感谢您的评论 :( 但我还是不明白......所以当派生类继承为受保护时,我基本上不能使用多态性? 是的,不在类或其派生类之外。这就是受保护的继承的含义。看来您想使用公共继承。

以上是关于多态性和受保护的继承问题的主要内容,如果未能解决你的问题,请参考以下文章

Java多态的理解

封装继承多态

私有继承、公有继承和受保护继承之间的区别

私有继承、公有继承和受保护继承之间的区别

面向对象的封装继承多态

如何禁止公共继承但允许私有(和受保护)继承