我有以下一组以网格方式相互继承的类。在顶层,我有抽象类。 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 ();
}
答案 0 :(得分:0)
原来,该问题与我的代码中原始类中的其他虚函数有关。上面的代码可以正常工作。在开发过程中,我遇到了其他问题,因此我向她发布了一个新代码,该代码解决了所有这些问题,并在其旁边提到了注释:
// 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。