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?
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ế". –
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