Nel seguente codice, ho tentato di creare un oggetto per visualizzare l'ordine del costruttore nell'eredità multistrato, ma trovo la struttura di obj
e le chiamate del costruttore in questo caso un po 'strane.Come viene costruita la base diretta nell'eredità virtuale?
#include<iostream>
using namespace std;
class Base1 {
public:
Base1(void) {
cout << "class Base1" << endl;
}
};
class Base2 {
public:
Base2(void) {
cout << "class Base2" << endl; }
};
class Level1 : public Base2, virtual public Base1
{
public:
Level1(void)
{
cout << "class Level1" << endl;
}
};
class Level2 : public Base2, virtual public Base1
{
public:
Level2(void)
{
cout << "class Level2" << endl;
}
};
class Leaf :virtual public Level2, virtual public Level1
{
public:
Leaf(void)
{
cout << "class Leaf" << endl;
}
};
int main(void)
{
Leaf obj;
return 0;
}
Con l'uscita mostra il costruttore chiama:
class Base1
class Base2
clase Level2
class Base2
class Level1
class Leaf
Ma la struttura di obj alla fine del programma è in realtà:
obj
--Level2
----Base2
----Base1
--Level1
----Base2
----Base1
--Base1
So che la Base1
di obj
è virtuale ereditata, ma durante la costruzione di obj
, sono anche necessari la costruzione di Level2
e Level1
, che porta a Base1
in ciascuna delle loro strutture. Ma l'intero processo di costruzione chiama una volta il costruttore Base1
. Non posso spiegarlo. Significa che lo Base1
in Level2
e Level1
all'interno di obj
condivide gli stessi dati con Base1
che appartiene direttamente a obj
?
L'intero punto dell'ereditarietà virtuale è che si dispone solo di * un * subobject di base virtuale. –
Sapete che a differenza di C, in C++ la lista dei parametri vuota è semplicemente '()', giusto? – curiousguy