繁体   English   中英

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

[英]How to solve a mesh inheritance problem in C++

我有以下以网格方式相互继承的类集。 在顶层,我有抽象类。 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 ,应将虚拟析构函数添加到顶级类。 检查以下有关它的讨论

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM