Tôi đang cố gắng cấu trúc lại một số mã trong khi vẫn giữ nguyên chức năng hiện tại. Tôi gặp sự cố khi truyền một con trỏ tới một đối tượng vào một giao diện cơ sở và sau đó nhận được lớp dẫn xuất sau này. Chương trình sử dụng một đối tượng nhà máy để tạo ra các thể hiện của các đối tượng này trong một số trường hợp nhất định.Không thể truyền một lớp có nhiều thừa kế
Dưới đây là một số ví dụ về các lớp tôi đang làm việc.
// This is the one I'm working with now that is causing all the trouble.
// Some, but not all methods in NewAbstract and OldAbstract overlap, so I
// used virtual inheritance.
class MyObject : virtual public NewAbstract, virtual public OldAbstract { ... }
// This is what it looked like before
class MyObject : public OldAbstract { ... }
// This is an example of most other classes that use the base interface
class NormalObject : public ISerializable
// The two abstract classes. They inherit from the same object.
class NewAbstract : public ISerializable { ... }
class OldAbstract : public ISerializable { ... }
// A factory object used to create instances of ISerializable objects.
template<class T> class Factory
{
public:
...
virtual ISerializable* createObject() const
{
return static_cast<ISerializable*>(new T()); // current factory code
}
...
}
This question có thông tin tốt về các loại đúc khác nhau, nhưng nó không giúp tôi tìm ra tình huống này. Sử dụng static_cast và truyền thường xuyên cho tôi error C2594: 'static_cast': ambiguous conversions from 'MyObject *' to 'ISerializable *'
. Sử dụng dynamic_cast gây ra createObject() để trả về NULL. Các lớp kiểu NormalObject và phiên bản cũ của MyObject làm việc với static_cast hiện có trong nhà máy.
Có cách nào để làm cho dàn diễn viên này hoạt động không? Có vẻ như nó sẽ là có thể.
+1: Điều này cũng làm việc trên gcc. – Troubadour
Giải pháp chính xác mà Câu hỏi thường gặp đề xuất: http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8 –
Điều này giải quyết được.Tôi đã không nhận ra những tóm tắt là những thứ cần thiết để kế thừa. @Mark Ransom, cảm ơn vì liên kết tuyệt vời. Toàn bộ trang đó rất hữu ích. –