Tôi hiện đang làm việc tích hợp gói của bên thứ ba sử dụng nhiều công cụ RTTI trên nền tảng không RTTI (Android). Về cơ bản, tôi đã thực hiện RTTI của riêng mình nhưng tôi bị kẹt trên một vấn đề.C++ - downcasting đối tượng thừa kế hình dạng kim cương mà không có RTTI/dynamic_cast
Vấn đề là rất nhiều lớp đang gặp vấn đề thừa kế kim cương vì tất cả các lớp bắt nguồn từ cùng một lớp cơ sở (đối tượng) .. và vì vậy, nếu tôi muốn downcast từ lớp cơ sở đến lớp dẫn xuất, Tôi phải sử dụng dynamic_cast - nhưng RTTI không có sẵn! Làm thế nào để chuyển đổi một đối tượng từ cha mẹ sang con khi có thừa kế ảo mà không có dynamic_cast?
Dường như rằng:
class A
{
public:
virtual char* func() { return "A"; };
};
class B : public virtual A
{
public:
//virtual char* func() { return "B"; };
};
class C : public virtual A
{
public:
//virtual char* func() { return "C"; };
};
class D : public B, public C
{
public:
//virtual char* func() { return "D"; };
};
D d;
A* pa = static_cast<A*>(&d);
D* pd = static_cast<D*>(pa); // can't do that! dynamic_cast does work though...
Đó là lỗi của tôi:
lỗi C2635: không thể chuyển đổi một 'A *' một 'D *'; chuyển đổi từ một lớp cơ sở ảo được ngụ ý
lỗi C2440: 'khởi': không thể chuyển đổi từ 'test_convert :: A *' thành 'test_convert :: D *' Cast từ cơ sở để có nguồn gốc đòi hỏi dynamic_cast hoặc static_cast
Bất kỳ ý tưởng nào?
heh, MS vừa nói để xóa từ khóa ảo khỏi mã và nó sẽ giải quyết được sự cố. Xem tài liệu của họ về lỗi, tôi không đùa đâu. –
Hum ... sau đó, làm điều đó cho tôi lỗi 2594 (xem http://msdn.microsoft.com/en-us/library/5xata8be.aspx). Bây giờ, để khắc phục, họ đề xuất sử dụng một chuỗi chuyển đổi như "static_cast (static_cast (p));". Ý tưởng là tốt, nhưng chúng ta chỉ có thể làm điều đó khi chúng ta biết chính xác toàn bộ cây thừa kế .... và đó không phải lúc nào cũng như vậy. Tuy nhiên, điều này giả định rằng lớp cha mẹ ảo có thể được nhân đôi (trong trường hợp của tôi là tốt). Vì vậy, tôi sẽ thử nó ... nhưng để làm như vậy, tôi sẽ phải tìm một cách để có được thứ bậc từ cha mẹ sang con. –
Adam
Ai nói với bạn rằng Android là một nền tảng không phải là rtti? Các ND5 r5 và mới hơn nên hỗ trợ RTTI (tôi tin rằng bạn cần phải bật nó với '-frtti', nhưng nó sẽ hoạt động sau đó). Ngay cả đối với các nền tảng cũ hơn, vì tất cả đều được liên kết tĩnh. –