Trong đoạn mã sau, trình biên dịch yêu cầu cơ sở lớp X là mặc định có thể xây dựng. Tuy nhiên, nếu tôi loại bỏ các ảo từ khóa từ sản nghiệp của lớp Node, việc tiếp cận với các thành viên m_x trở nên, tất nhiên, không rõ ràng, nhưng các nhà xây dựng mặc định cho lớp X là không còn cần thiết .Thừa kế ảo có buộc một lớp cơ sở là cấu hình mặc định không?
Lý do cho điều đó là gì?
#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;
}
Đây không phải là ví dụ * tối thiểu *. Tôi có thể cắt khoảng 100 dòng mã từ đây! – Barry
@Barry xin lỗi vì điều đó, nhưng tôi nghĩ rằng điều duy nhất dư thừa để giữ cho ví dụ hợp lệ là lớp cơ sở C. Tôi hy vọng mã rõ ràng ngay cả khi nó dài hơn một chút so với mức tối thiểu. – nyarlathotep108
Chỉ cần 'A',' X' và 'Node' là đủ (không cần 'Áp dụng',' Thừa kế', 'B',' C' hoặc 'Ví dụ' ...) –
Barry