2010-10-03 44 views
6

Tôi có hai lớpcopy constructor của cơ sở và các lớp thừa kế

///////////BASE CLASS 

    class Base{ 
    public: 
    Base(int = 0); 
    ~Base(); 
    Base(Base&); 
    Base(Derived&); ////<-may be problem here?, note: I tried without this function 
    int valueOfBase(); 
    protected: 
    int protectedData; 
    private: 
    int baseData; 
    }; 

    /////////////DERIVED CLASS 
    class Derived: public Base{ 
    public: 
    Derived(int); 
    //Derived(Derived&); 
    ~Derived(); 
    private: 
    int derivedData; 
    }; 

and here my main 

    int main(){ 
    Base base(1); 
    Derived derived = base; 
    return 0; 
    } 

tôi đọc rằng nếu lớp có nguồn gốc của tôi không có bản sao c'tor copy c'tor of the base will be called nhưng mỗi khi tôi nhận conversion from Base to non-scalar type Derived requested người là sai? trình biên dịch của tôi hoặc cuốn sách của tôi, hoặc tôi vừa hiểu nhầm? cảm ơn trước

+5

Bạn có thể đã đọc sai (trình tạo bản sao được tạo bởi trình biên dịch cho Derived * cũng * sao chép phần Cơ sở của đối tượng, sử dụng hàm tạo bản sao của Cơ sở). - Sử dụng hàm tạo bản sao của parent * thay cho * không có ý nghĩa: điều đó có nghĩa là * theo mặc định * các đối tượng sẽ được cắt lát khi sao chép. – UncleBens

Trả lời

3

Chỉ là gợi ý.

Mã sau có đưa ra cùng lỗi không?

class base{}; 
class derived: public base{}; 

int main() 
{ 
     derived d= base(); 
} 

Có? Tại sao? Bởi vì không có chuyển đổi từ lớp cơ sở đến lớp dẫn xuất. Bạn nên xác định chuyển đổi này nếu bạn muốn biên dịch mã của mình.

Làm cách nào để thêm lớp này vào lớp được dẫn xuất?

derived(const base &b){} 

Làm cho tinh thần, huh?

+0

cảm ơn câu trả lời của bạn nhưng tôi biết, cuối cùng tôi đã viết câu hỏi của mình, tôi đọc trong cuốn sách của tôi quy tắc này, tôi đã thực hiện nó, nhưng nó dường như không hoạt động, là nó có thể làm điều đó mà không có nguồn gốc (const base & b) {}? – rookie

+3

Đọc nhận xét của @UncleBens về câu hỏi của bạn. –

Các vấn đề liên quan