Nel seguente codice, il compilatore richiede la classe di base X per il predefinito constructible. Tuttavia, se mi tolgo la virtuale parola chiave dall'eredità del Nodo classe, l'accesso al membro m_x diventa, ovviamente, ambiguo, ma il costruttore predefinita per classe X non è più necessaria .L'ereditarietà virtuale costringe una classe base a essere costruita in modo predefinito?
Qual è il motivo?
#include <iostream>
struct Apply
{
template< typename T >
struct Node : virtual T // this line contains the virtual inheritance
{
template< typename ...Args>
Node(Args... args)
: T(args...)
{}
};
template < typename ...BaseClasses>
struct Inheritance;
template < typename FirstBaseClass, typename ...OtherBaseClasses>
struct Inheritance< FirstBaseClass, OtherBaseClasses... > : FirstBaseClass
, Inheritance<OtherBaseClasses...>
{
template< typename ...Args>
Inheritance(Args... args)
: FirstBaseClass(args...)
, Inheritance<OtherBaseClasses...>(args...)
{
}
};
};
template < >
struct Apply::Inheritance< >
{
template< typename ...Args>
Inheritance(Args... args){}
};
struct X
{
X(int i){}
int m_x;
};
struct A : Apply::Node<X>
{
A(int i)
: Apply::Node<X>(i)
, m_a(i)
{
}
int m_a;
};
struct B : Apply::Node<X>
{
B(int i)
: Apply::Node<X>(i)
, m_b(i)
{ }
int m_b;
};
struct C : Apply::Node<X>
{
C(int i)
: Apply::Node<X>(i)
, m_c(i)
{ }
int m_c;
};
struct Example : Apply::Inheritance< A, B, C >
{
Example(int i)
: Apply::Inheritance< A, B, C >(i)
{ }
void print() const
{
// this line needs the virtual inheritance
std::cout << m_x << std::endl;
std::cout << m_a << std::endl;
std::cout << m_b << std::endl;
std::cout << m_c << std::endl;
}
};
int main()
{
Example ex(10);
ex.print();
return 0;
}
Questo non è un esempio * minimo *. Posso tagliare circa 100 linee di codice da qui! – Barry
@Barry scusa per quello, ma penso che l'unica cosa ridondante per mantenere valido l'esempio sia la classe base C. Spero che il codice sia chiaro anche se è un po 'più lungo del minimo. – nyarlathotep108
Solo 'A',' X' e 'Nodo' sono sufficienti (non è necessario 'Apply',' Ereditarietà', 'B',' C' o 'Example' ...) –
Barry