2012-02-08 21 views
6

en kod parçacığı başlayalım: GCC 4.5.1 ve 4.6.1 Türetilmiş sınıfın yapıcıları arasındaki tek fark ilki açıkça belirtmektedir ki temel1'den ile Derleyengcc 4.5.1 sanal miras sorunu

#include <iostream> 

struct God{ 
    God(){_test = 8;} 
    virtual ~God(){} 
    int _test; 
}; 

struct Base1 : public virtual God{ 
    //Base1(){std::cout << "Base1::Base1" << std::endl;} //enable this line to fix problem 
    virtual ~Base1(){} 
}; 

struct Base2 : public virtual Base1{ 
    virtual ~Base2(){} 
}; 

struct A1 : public virtual Base2{ 
    A1(){std::cout << "A1:A1()" << std::endl;} 
    virtual ~A1(){}; 
}; 

struct A2 : public virtual Base2{ 
    A2(){std::cout << "A2:A2()" << std::endl;} 
    virtual ~A2(){}; 
}; 


struct Derived: public virtual A1, public virtual A2{ 
    Derived():Base1(){std::cout << "Derived::Derived()" << std::endl;} 
    Derived(int i){std::cout << "Derived(i)::Derived(i)" << std::endl;}   
    virtual ~Derived(){} 
}; 


int main(){ 

    God* b1 = new Derived(); 
    std::cout << b1->_test << std::endl; //why it prints 0? 

    God* b2 = new Derived(5); 
    std::cout << b2->_test << std::endl; 

    return 0; 
} 

kurucu çağrılmalıdır. Her iki cout'un main() print 8'de olmasını beklerim. Ne yazık ki ilk baskı 0 !.

Neden?

Base1 yapıcısının açık tanımlamasını etkinleştirirsem, sorunu giderir. Türetilmiş sınıf tanımında sanal miras kaldırırsam (türetilmiş: public A1, public A2) de çalışır. Bu beklenen bir davranış mıdır?

konu GCC 3.4.4 veya Microsoft derleyici (VS)

+0

gcc 3.4.6 ile "8" aldım. – Beta

+0

Kesinlikle bana bir gcc hatası tetiklediniz gibi görünüyor. –

cevap

1

Bu derleyici hata olmalı altında gözlemlenebilir değildir. Ayrıca GCC 4.2.1'i test ettim ve sonuç her iki durumda da 8'dir.

1

Birkaç eski lezzetle (4.3'e kadar - çalışır) test ettim - elimde 4.4 serisine sahip değilim (sabah test edecek), ama kabul ediyorum ki, bu bir hata gibi görünüyor. db), muhtemelen onu yükseltmeye değer.

Ancak, ilk ilişkiyi (Base1God sanal olmayandan sanal olmayana) değiştirirseniz, bunun örnek beklendiği gibi çalıştığını fark ediyorum. En çok türetilen sınıftan (bu yaklaşımı daha önce hiç görmemiş olsam da) doğrudan God kronunu arayacak olsanız da, bu sizin ihtiyaçlarınıza bağlıdır.