sckz
29/06/2005, 19:53
spaydır men ile betmen in maskesi altında aynı yüz varsa nolur : virtual inheritance
#include <iostream>
using namespace std;
class A
{
public :
int a;
A()
{
a = 5;
cout << __FUNCSIG__ << endl;
}
};
class B : public A
{
public :
B()
{
a = 6;
cout << __FUNCSIG__ << endl;
}
};
class C : public A
{
public :
C()
{
a = 7;
cout << __FUNCSIG__ << endl;
}
};
class D : public B, public C
{
public :
D()
{
cout << __FUNCSIG__ << endl;
}
};
int main()
{
D d;
return 0;
}
Yukarıdaki kodda d nesnesi B ve C tipinde iki alt nesneye sahip… Dolayısıyla D nin yapılandırıcısı çağrılmadan önce B ve C nin yapılandırıcısı çağrılacak.. B sınıfından oluşturulacak nesneler de A tipinde bir alt nesneye sahip.. ve aynı şekilde önce A alt nesnesinin yapılandırıcısı çağrılacak..
Bu mantıkla önce D nin B tipindeki alt nesnesinin A tipindeki alt nesnesinin yapılandırıcısı, sonra B alt nesnesinin kendi yapılandırıcısı; Sonra D nin C tipindeki alt nesnesinin A tipindeki alt nesnesinin yapılandırıcısı, sonra C alt nesnesinin kendi yapılandırıcı çağrılacak.. Ve en sonunda D sınıfının yapılandırıcısı çağrılıp d nesnesi oluşturulmuş olacak..
Çıktı :
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall A::A(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Burada sorun yok.. Devam edelim…
Sonra B ve C sınıflarını A sınıfından virtual olarak türetirsek ve D yi de B ve C sınıflarından türettiğimizde, D sınıfının alt nesneleri olan B ve C sınıfına ait nesneler aynı A alt nesnesini kullanacağından çıktı:
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Olur.. yine sorun yok.. Her şey beklenildiği gibi (debugger kullanırsanız, local penceresinde d nesnesinin B ve C alt nesnesinin a üyesinin aynı degere(7) sahip oldugunu görebilirsiniz)..
Sanal temel sınıflar ın çoklu kalıtımla bağlantılı olduğunu biliyorum yalnız.. Ama B yi A dan normal olarak türetip, C yi virtual olarak türettiğimizde çıktı :
__thiscall A::A(void)
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Oluyo.. Da ? neden böle oluyo (bu birinci sorum)? (çünkü bu durumda B nin de bir C nin de bir A alt nesnesi var..)
Sorumun ikinci kısmı aslında birinci kısmının aynısı.. yani aslında ikinci soruya hiç gerek yok 8).. ben daha görkemli sorular sormak isterdim tabi ki ama kafama bunlar takıldı..
Şimdi C yi A dan normal olarak türetip, B yi sanal olarak türettiğimizde ise çıktı en baştaki gibi, yani :
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall A::A(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Oluyo… işte ben bunu da anlamadım ? dedim ya ikinci sorumla birincisi aynı.. yani neden anlamadım ? bir şeyleri yanlış mı biliyorum..
Pliz help mi..
#include <iostream>
using namespace std;
class A
{
public :
int a;
A()
{
a = 5;
cout << __FUNCSIG__ << endl;
}
};
class B : public A
{
public :
B()
{
a = 6;
cout << __FUNCSIG__ << endl;
}
};
class C : public A
{
public :
C()
{
a = 7;
cout << __FUNCSIG__ << endl;
}
};
class D : public B, public C
{
public :
D()
{
cout << __FUNCSIG__ << endl;
}
};
int main()
{
D d;
return 0;
}
Yukarıdaki kodda d nesnesi B ve C tipinde iki alt nesneye sahip… Dolayısıyla D nin yapılandırıcısı çağrılmadan önce B ve C nin yapılandırıcısı çağrılacak.. B sınıfından oluşturulacak nesneler de A tipinde bir alt nesneye sahip.. ve aynı şekilde önce A alt nesnesinin yapılandırıcısı çağrılacak..
Bu mantıkla önce D nin B tipindeki alt nesnesinin A tipindeki alt nesnesinin yapılandırıcısı, sonra B alt nesnesinin kendi yapılandırıcısı; Sonra D nin C tipindeki alt nesnesinin A tipindeki alt nesnesinin yapılandırıcısı, sonra C alt nesnesinin kendi yapılandırıcı çağrılacak.. Ve en sonunda D sınıfının yapılandırıcısı çağrılıp d nesnesi oluşturulmuş olacak..
Çıktı :
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall A::A(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Burada sorun yok.. Devam edelim…
Sonra B ve C sınıflarını A sınıfından virtual olarak türetirsek ve D yi de B ve C sınıflarından türettiğimizde, D sınıfının alt nesneleri olan B ve C sınıfına ait nesneler aynı A alt nesnesini kullanacağından çıktı:
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Olur.. yine sorun yok.. Her şey beklenildiği gibi (debugger kullanırsanız, local penceresinde d nesnesinin B ve C alt nesnesinin a üyesinin aynı degere(7) sahip oldugunu görebilirsiniz)..
Sanal temel sınıflar ın çoklu kalıtımla bağlantılı olduğunu biliyorum yalnız.. Ama B yi A dan normal olarak türetip, C yi virtual olarak türettiğimizde çıktı :
__thiscall A::A(void)
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Oluyo.. Da ? neden böle oluyo (bu birinci sorum)? (çünkü bu durumda B nin de bir C nin de bir A alt nesnesi var..)
Sorumun ikinci kısmı aslında birinci kısmının aynısı.. yani aslında ikinci soruya hiç gerek yok 8).. ben daha görkemli sorular sormak isterdim tabi ki ama kafama bunlar takıldı..
Şimdi C yi A dan normal olarak türetip, B yi sanal olarak türettiğimizde ise çıktı en baştaki gibi, yani :
__thiscall A::A(void)
__thiscall B::B(void)
__thiscall A::A(void)
__thiscall C::C(void)
__thiscall D:: D(void)
Oluyo… işte ben bunu da anlamadım ? dedim ya ikinci sorumla birincisi aynı.. yani neden anlamadım ? bir şeyleri yanlış mı biliyorum..
Pliz help mi..