6

Tôi có một số rắc rối với việc áp dụng đa hình trong ví dụ này. Câu hỏi này cũng tương tự như câu hỏi cuối cùng của tôiC++, lỗi kế thừa không rõ ràng trong năm 2010

C++, virtual inheritance, strange abstract class + clone problem

Có 3 lớp trừu tượng:

class A 
{ 
public: 
    virtual A * copy() const = 0; 
    virtual ~A() = 0; 
}; 

A::~A(){} 

class B 
{ 
public: 
    virtual B * copy() const = 0; 
    virtual ~B() = 0; 
}; 

B::~B(){} 

class C: virtual public A , public B 
{ 
public: 
    virtual C * copy() const = 0; 
    virtual ~C() = 0; 
}; 

C::~C(){} 

và hai lớp kế thừa bằng cách sử dụng thừa kế ảo

class D: virtual public A 
{ 
public: 
    virtual D * copy() const {return new D (*this);} 
    virtual ~D() {} 
}; 

class E: virtual public D , public C 
{ 
public: 
    virtual E * copy() const {return new E (*this);} 
    virtual ~E() {} 
}; //Error C2250: 'E' : ambiguous inheritance of 'D *A::copy(void) const 

Các lỗi nêu trên xảy ra chỉ sử dụng trình biên dịch MSVS 2010, g ++ biên dịch mã này OK.

Biểu đồ lớp (đơn giản)

.......... A .... B..... 
........../.\..../...... 
........./...\../....... 
......../.....\/........ 
.......D...... C........ 
........\...../......... 
.........\.../.......... 
..........\./........... 
...........E............ 

thảo luận ngoái chúng tôi đã đóng cửa với kết quả: loại bỏ các tuyên bố của các bản sao() phương pháp từ lớp C.

class C: virtual public A , public B 
{ 
public: 
    //virtual C * copy() const = 0; //remove declaration 
    virtual ~C() = 0; 
}; 

C::~C(){} 

mẫu mã sử dụng của tôi nhu cầu đa hình để tạo ra vector của con trỏ đến C. Sau khi loại bỏ một số yếu tố tôi muốn tạo bản sao của nó ... Tôi CẦN một tuyên bố của bản sao() trong lớp C, do đó, loại bỏ các tuyên bố là không đủ và nó không giải quyết được vấn đề.

int main(int argc, char* argv[]) 
{ 
std::vector <C*> items; 
items.push_back(new E()); 
items.push_back(new E()); 
items[0]->copy(); 
return 0; 
} 

Bạn có thể giúp tôi, làm cách nào để sửa mã được dịch bằng cách sử dụng VS 2010?

+1

Tra cứu thừa kế 'ảo' trong sách C++, Câu hỏi thường gặp hoặc trang web tham chiếu yêu thích của bạn. Ngoài ra tìm kiếm trên web cho "C + + thừa kế kim cương thừa kế". –

+0

Tôi biết vấn đề này ... Nhưng làm thế nào nó liên quan đến câu hỏi của tôi? Mã này là chính xác, nhưng MSVS 2010 không biên dịch nó tuy nhiên trình biên dịch g ++ ant oher có ... – Johnas

Trả lời

7

Đây là một lỗi được biết đến trong Visual C++:

Visual C++ incorrectly reports ambiguity when covariance is used with virtual inheritance

Bạn có thể cần phải loại bỏ các hiệp phương sai hoặc thừa kế ảo. Thật không may, bạn không thể có cả hai.

+0

Cảm ơn câu trả lời của bạn. Nếu tôi hiểu một cách chính xác, do đó, lỗi sẽ sửa chữa trong phiên bản tiếp theo VS ... Có cách nào khác làm thế nào để biên dịch mã bằng cách sử dụng MSVS2010 (cài đặt trình biên dịch ...)? – Johnas

+1

Không, lỗi đã bị đóng là "Không khắc phục" có nghĩa là lỗi sẽ không được khắc phục trong bản phát hành tiếp theo. Có vẻ như không thể sử dụng Visual C++ để biên dịch mã kết hợp thừa kế ảo với hiệp phương sai. Nếu đây là một vấn đề quan trọng đối với bạn, hãy đi đến lỗi Kết nối đó, upvote nó, bấm vào nút "Tôi có thể quá" dưới "N người dùng có thể repro lỗi này," và để lại một bình luận. –

+0

Thật khó chịu. Chúng tôi có thể mong đợi rằng vấn đề này đôi khi sẽ được sửa chữa? Tôi không có bất kỳ kinh nghiệm với báo cáo lỗi cho Microsoft ... – Johnas