2010-06-15 71 views
-1

內我收到的功課做節目,而無需使用構造函數,所以這是我的代碼鑄造,我有兩個類:誤差在C++中,背景

class Base { 
protected: 
    int var; 
public: 
    Base(int var = 0); 
    Base(const Base&); 
    Base& operator=(const Base&); 
    virtual ~Base(){}; 
    virtual void foo(); 
    void foo() const; 
    operator int(); 
}; 

class Derived: public Base { 
public: 
    Derived(int var): Base(var){}; 
    Derived(const Base&); 
    Derived& Derived::operator=(const Base& base); 
    ~Derived(){}; 
    virtual void foo(); 
}; 

這裏有兩個我的衍生功能:

Derived::Derived(const Base& base){ 
    if (this != &base){ 
     var=base.var; 
    } 
} 

Derived& Derived::operator=(const Base& base){ 
    if (this != &base){ 
     var=base.var; 
    } 
    return *this; 
} 

但我有一個錯誤within context當我把這些行

Base base(5); 
Base *pderived = new Derived(base); //this row works perfectly 
Derived derived = *pderived; // I think the problem is here 

感謝您的幫助

+6

「在上下文中」僅爲錯誤消息的*部分*。這條線上面應該有東西告訴你實際的錯誤是什麼,以及該行下面的東西告訴你上下文(即行號和函數名)。 – 2010-06-15 20:35:54

+0

你知道嗎?Derived derived = * pderived;調用構造函數Derived :: Derived(const Base&base)'? – 2010-06-15 20:44:22

+0

這是由任何機會[非標量類型請求](http://stackoverflow.com/questions/3046463/non-scalar-type-requested/3046537#3046537)? – Troubadour 2010-06-15 20:45:41

回答

0

只能訪問受保護成員從另一個對象,如果該對象是相同的類型的試圖訪問它的對象。在你的例子中,構造函數和賦值操作符都採用const Base&,所以不能保證實際對象的類型爲Derived

0

存在錯誤(VS2010)

error C2248: 'Base::var' : cannot access protected member declared in class 'Base'

在線路

var=base.var;

+0

正確,因爲'base'可能具有type'class Other:public Base {};'。 「派生」不在「其他」的繼承鏈中,因此它無法訪問受保護的成員。 – 2010-06-15 20:57:04

0

Derived需要轉委託的Base成員複製到Base::operator=,而不是試圖把它的骯髒的小手放在另一個對象的保護成員。