如何在C++中解决网格继承问题

How to solve a mesh inheritance problem in C++

本文关键字:网格 继承 问题 解决 C++      更新时间:2023-10-16

我有以下一组类,它们以网格方式相互继承。在顶层,我有抽象类。Abstract_Class_BAbstract_Class_C都继承自Abstract_Class_A

在继承的第二级中,我有这些类的确切实现。

  1. Impl_Class_A继承自Abstract_Class_A
  2. Impl_Class_B继承自Abstract_Class_BImpl_Class_A
  3. Impl_Class_C继承自Abstract_Class_CImpl_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 ();
}

这个问题原来与我在代码中的原始类中的其他虚函数有关。上面的代码没有任何问题。在开发过程中,我遇到了其他问题,所以我给她发布了一个新代码,解决了所有这些问题,并在它们旁边提到了注释:

// Top Level (Level 1)
class Abstract_Class_A
{
     ~Abstract_Class_A (); // To solve source type is not polymorphic” when trying to use dynamic_cast
};
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, virtual public Impl_Class_A // Missing second virtual
{
};
class Impl_Class_C: virtual public Abstract_Class_C, virtual public Impl_Class_A // Missing second virtual
{
};
void test()
{
  Impl_Class_B* test = new Impl_Class_B ();
}

笔记:

  1. 对于这种类型的继承范例,不能使用static_cast,而应该使用dynamic_cast。查看以下讨论。
  2. 使用dynamic_cast时,应将虚拟析构函数添加到顶级类。 查看以下有关它的讨论。