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

Posted

技术标签:

【中文标题】如何在 C++ 中解决网格继承问题【英文标题】:How to solve a mesh inheritance problem in C++ 【发布时间】:2019-01-16 22:56:06 【问题描述】:

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

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

    Impl_Class_A 继承自 Abstract_Class_AImpl_Class_B 继承自 Abstract_Class_BImpl_Class_AImpl_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 ();

【问题讨论】:

我不知道为什么我得到-1,如果有不清楚的地方,至少这样做的人应该说明原因 我无法重现您的问题。您正在使用哪些编译器/编译器选项? 【参考方案1】:

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

// 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 ();

注意事项:

    使用这种类型的继承范例,您不能使用static_cast,而应该使用dynamic_cast。检查以下discussion。 当使用dynamic_cast 时,您应该在***类中添加一个虚拟析构函数。检查以下discussion 。

【讨论】:

只要引入virtual 方法,基本上就需要virtual 析构函数,否则编译器可能不知道如何删除派生对象。

以上是关于如何在 C++ 中解决网格继承问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 迭代数独子网格?

LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?

如何在 C++ 中按递增顺序绘制球体网格?

c++解决二义性的方法

编译器如何在继承 C++ 中进行组合?

如何让 PROJ C++ 识别网格目录?