У меня есть следующий набор классов, которые наследуются друг от друга в виде сетки. На верхнем уровне у меня есть абстрактные классы. И Abstract_Class_B
, и Abstract_Class_C
наследуются от Abstract_Class_A
.
На втором уровне наследования у меня есть точные реализации этих классов.
Impl_Class_A
наследуется от Abstract_Class_A
.
Impl_Class_B
наследуется от Abstract_Class_B
и Impl_Class_A
.
Impl_Class_C
наследуется от Abstract_Class_C
и Impl_Class_A
.
Когда я компилирую приведенный ниже код, компилятор прекрасно компилируется, если я не объявляю какой-либо класс в коде. Но когда я начинаю объявлять указатель на классы второго уровня, компилятор выдает следующую ошибку:
undefined reference to `VTT for ns3::Impl_Class_B'
undefined reference to `vtable for ns3::Impl_Class_B'
Я использовал virtual
для решения типичной проблемы алмазов в наследовании, но я все еще не могу скомпилировать. Имеет смысл, что компилятор запутывается из-за этого способа наследования. Но моя система требует такого дизайна для этих классов. Любое решение, чтобы решить эту проблему?
код:
// Top Level (Level 1)
class Abstract_Class_A
{
};
class Abstract_Class_B: virtual public Abstract_Class_A
{
public:
uint8_t type;
};
class Abstract_Class_C: virtual public Abstract_Class_A
{
};
// Second Level (Level 2)
class Impl_Class_A : virtual public Abstract_Class_A
{
public:
double angle;
};
class Impl_Class_B: virtual public Abstract_Class_B, Impl_Class_A
{
};
class Impl_Class_C: virtual public Abstract_Class_C, Impl_Class_A
{
};
void test()
{
Impl_Class_B* test = new Impl_Class_B ();
}