In questo momento sto imparando le funzionalità di Inheritance in C++ e ho voluto testare il concetto delle classi di base virtuale apprese di recente. Ho provato il seguente codice semplice:Perché l'inizializzazione uniforme in C++ 11 si comporta stranamente con le classi di base virtuali?
#include <iostream>
using namespace std;
class A
{
private:
int m_value;
string m_caller;
public:
A(int p_value, string p_caller) : m_value{p_value}, m_caller{p_caller}
{
cout<<"Instantiating A via "<<m_caller<<endl;
}
};
class B : virtual public A
{
private:
int m_value;
public:
B(int p_value1,int p_value2) : A{p_value1,"B"}, m_value{p_value2}
{
cout<<"Instantiating B."<<endl;
}
};
class C : public B
{
public:
C(int p_value1,int p_value2) : A{p_value1,"C"}, B(p_value1, p_value2)
{
cout<<"Instantiating C."<<endl;
}
};
int main()
{
C c1(1,2);
return 0;
}
Si prega di notare la B(p_value1, p_value2)
nel costruttore della classe C. Questo mi ha dato l'output desiderato:
Instantiating A via C
Instantiating B.
Instantiating C.
Ma, il momento in cui ho cambiato in B{p_value1, p_value2}
, ho ottenuto il seguente risultato:
Instantiating A via C
Instantiating A via B
Instantiating B.
Instantiating C.
ho provato a cercare la risposta, ma tutte le risposte mi sono citato alcuni standard C++ . Essendo un principiante in OOP, sto cercando una spiegazione più semplice per questo comportamento. Grazie mille!
P.S. Sto usando C :: B in Windows con il compilatore g ++ 4.8.1.
Fyi, clang ++ 3.7 non mostra il comportamento che stai descrivendo. Entrambe le versioni emettono lo stesso risultato (il primo). – WhozCraig
Si sta chiamando il costruttore di copie nel secondo caso. – lorro
@UpAndAdam La classe più derivata è responsabile per l'inizializzazione delle classi di base virtuali, il codice non verrebbe compilato se l'OP non chiamasse direttamente il costruttore 'A'. E di cosa si tratta * passando in letterali stringa convertiti come se fossero ints *? – Praetorian