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)
gcc 3.4.6 ile "8" aldım. – Beta
Kesinlikle bana bir gcc hatası tetiklediniz gibi görünüyor. –