2011-01-29 46 views
5

Bu örnekte bazı sınıflarım olduğunu varsayalım.Miras bellek depolaması olan nesneler

class A { 
    int k, m; 
public: 
    A(int a, int b) { 
      k = a; 
      m = b; 
    } 
}; 

class B { 
    int k, m; 
public: 
    B() { 
      k = 2; 
      m = 3; 
    } 
}; 

class C : private A, private B { 
    int k, m; 
public: 
    C(int a, int b) : A(a, b) { 
      k = b; 
      m = a; 
    } 
}; 

Şimdi, bir C nesnesinde, belirli bir şekilde saklanan değişkenler nelerdir? Bir POD nesnesinde ne olduğunu biliyorum, ancak bu bir POD nesnesi değildir ...

cevap

2

, C++ Standart bahseder:

temel sınıf alt nesneler en türetilmiş nesne (1.8) tahsis sırası belirsizdir.

Yani, örnekte C nesneleri her tür A bir taban sınıfı subobject ve tip B bir taban sınıfı subobject var ama A taban elemanı önce veya B taban elemanı belirtilmemiş sonra gelip gelmediğini.

0

Standart tarafından gerekip gerekmediğinden emin olmamama rağmen, makul bir uygulamada bunların içinde saklandıklarının farkındayım Sipariş: A :: k, A :: m, B :: k, B :: m, C :: k, C :: m (muhtemelen donanım gereksinimlerine göre hizalanır). Düşünebildiğim bu bilginin tek pratik sebebi, C'ye bir işaretçiyi B'ye çevirirseniz, o zaman değerinin (adres) farklı olacağını, dolayısıyla bu konuda çok dikkatli olmanız gerektiğini anlamanız gerektiğidir. atmalar (bunun için reinterpret_cast <> kullanmayın). Bölüm 10, Türetilmiş sınıfların giriş bölümünde

+0

Bu, birçok uygulama için muhtemelen doğrudur, ancak herhangi bir garanti olduğunu düşünmüyorum. –

+0

@jdv, doğru, muhtemelen uygulamaya özgüdür, ancak uygulanabilecek başka bir yol düşünemiyorum. Yine de cevaba bir not eklemeliyim. –