10

Aşağıdaki kod, sanal miras eksikliğinden hala olumsuz etkilenir mi?Temel sınıflar veri üyesi içermediğinde sanal miras hala gerekli midir?

Eğer öyleyse, olumsuz etkileri ile aynı olacağını (ya kadar kötü) class A veri üyeleri içeren eğer sanal miras olmadan çoklu miras olumsuz etkileri?

class A 
{ 
public : 
    virtual ~A () { } 
    virtual int foo () const = 0 ; 
} ; 

class B : public A 
{ 
public : 
    virtual ~B () { } 
} ; 

class C : public A 
{ 
public : 
    virtual ~C () { } 
} ; 

class D : public B , public C 
{ 
public : 
    virtual int foo () const { return 12 ; } 
} ; 
+1

O [görünüyor gayet derleyecek Burada (http://coliru.stacked-crooked.com/view?id=8bd2970b897e9b44), yani B'den türetilmiş bir A işaretçisinin C'den türetilmiş gibi aynı değere sahip olmasını beklerseniz, – Niall

+1

yolunda, A'da boş bir uygulama ile sanal bir yıkıcıyı bildirmeniz gerekir. Bkz. http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors – Notinlist

+0

@Notinlist Yakalama için teşekkürler. Güvenlik için A, B ve C'ye sanal yıkıcılar ekledim. – Giffyguy

cevap

4

için iki miras yolları vardır çünkü, size böyle bir şey yapmak mümkün olmaz miras sanal yapmazsanız, genel arayüz olarak A kullanmak istediğiniz varsayarsak çocuğun D gelen taban sınıfı A:

int main() 
{ 
    D d; 
    const A& a = d; 

    std::cout << a.foo() << " " << d.foo() << " " << std::endl; 
} 

sonra bir A olarak D (A) Neden soyut bir ilk etapta tabanı ve (B) olarak var mı yok kullanmak gerekmiyorsa kalıtımın sanal olmasına gerek yoktur. ara sınıfların sanal devralma kullanarak

1
class B : public virtual A { } ; 
class C : public virtual A { } ; 

, senin D sınıfı yalnızca sınıf A tek bir örneğini olacak ve sen kodlarının `bkz virtual` gerekiyor gibi