6

Bu örnekteki polimorfizm uygulamasıyla bazı sıkıntılarım var.C++, 2010 yılında belirsiz kalıtım hatası

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(){} 

ve iki kalıtsal sınıfları

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 

yukarıda belirtilen hata oluşur sanal devralma kullanarak: Bu soru 3 soyut sınıflar vardır

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

benim son soruya benzer Sadece MSVS 2010 derleyicisini kullanarak, g ++ bu kodu derler. (Basitleştirilmiş)

Sınıf diyagramı biz sonuçla kapatmak

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

Son tartışma:

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

C::~C(){} 

Benim örnek kod polimorfizmi ihtiyaçlarını kullanarak sınıf C'den kopya() metodunun beyanı kaldırmak C işaretçilerinin vektörünü oluşturmak için kopyasını oluşturmak istediğiniz bir öğe kaldırdıktan sonra ... Ben C sınıfı bir copy() bildirimi gerekir, bu nedenle bildirimin kaldırılması yetersizdir ve sorunu çözmez.

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; 
} 

beni nasıl kodunu 2010 VS kullanarak çevrilebilir olması düzeltmek için yardım eder misiniz?

+1

Favori C++ kitabınızda, SSS'de veya başvuru sitenizde 'sanal' devralmaya bakın. Ayrıca "C++ korkulu elmas mirası" için web'de arama yapın. –

+0

Bu problemi biliyorum ... Ama bu benim sorum ile nasıl bağlantılı? Bu kod doğru, ancak MSVS 2010 ancak derlemek değil g ++ ant oher derleyiciler evet ... – Johnas

cevap

7

Bu, Visual C++ bilinen bir hatadır:

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

Ya kovaryansını veya sanal devralma ortadan kaldırmak gerekir. Maalesef ikisine de sahip olamazsın.

+0

Cevabınız için teşekkürler. Eğer doğru bir şekilde anlarsam, hata bir sonraki sürümde (VS) düzeltilecektir ... MSVS2010 (derleyici ayarları ...) kullanarak kodun nasıl derleneceği başka bir yol var mı? – Johnas

+1

Hayır, hata "Silmeyecek" olarak kapatıldı, yani sonraki sürümde sabitlenmeyecek. Görünen o ki, sanal devralmayı kovaryans ile birleştiren kod derlemek için Visual C++ kullanmak mümkün değildir. Bu sizin için önemli bir sorunsa, lütfen Bağlan hataya gidin, onu tekrar deneyin, "N kullanıcılar bu hatayı tekrarlayabilir" altındaki "Ben de" düğmesini tıklayıp bir yorum bırakın. –

+0

Bu sinir bozucu. Bu sorunun bazen düzeltileceğini düşünüyor olabilir miyiz? Microsoft'a hata bildirimi ile ilgili herhangi bir deneyimim yok ... – Johnas