C ++多重继承知道它是否是直接层次结构路径之外的类

时间:2014-04-04 22:23:29

标签: c++ polymorphism multiple-inheritance

我有以下类的层次结构

A
|-B   I
  |-C-|

A是系统的类; B和C是我自己的。

在系统中还有一个函数返回指向A实例的指针。

我是一个小班,如果可能,甚至没有任何成员。

当我这样做时

A* pA= A::GetInstance();
if(!pA)
    return;

I* pI= dynamic_cast<I*>(pA);
if(!pI)
    return;

我的Instance是C,dynamic_cast总是失败!如果我观察pA变量并打开相应的节点,它会显示I类的一行,让我认为它是可投射的!奇怪! ...

因此,在阅读了互联网上的一些信息之后,似乎我认为该课程需要虚拟。

我尝试的事情:

  • 将演员阵容更改为static_cast。它甚至没有编译!我转回到dynamic_cast!

  • 使用空体添加虚拟析构函数。 dynamic_cast失败!

  • 将析构函数更改为纯虚拟。这甚至都没有编译(注意:B和C类已经有了虚拟析构函数!)

  • 删除了析构函数,并在I类中实现了一个带有空体的void Dumb()方法。 dynamic_cast再次失败!

  • 将该方法更改为纯虚拟,并在C中添加void Dumb()方法,并使用空体。它再次失败了!

请问,我该怎么做才能知道我的pA“是否是”我?

更新:根据热门请求,我为这些类添加了一些最小代码:

// class A is not mine, and it indirectly inherits
// public CObject and has a virtual destructor!

class B: public A
{
public:
  virtual ~B();

 // the code!
};

class I
{
};

class C: public B, I
{
public:
  virtual ~B();

 // the code!
};

3 个答案:

答案 0 :(得分:3)

class C: public B, I
{ //...

IC的私有基类,因为您未指定I的访问权限。 (您的public仅适用于B。因此C类型的对象实际上不是Idynamic_cast只能遵循公有继承关系。

如果将其更改为:

,则可能会得到不同的结果
class C: public B, public I
{ //...

答案 1 :(得分:2)

以下作品:

#include <cstdio>

class A { public: virtual ~A() { } };
class B : public A { };
class I { };
class C : public B, public I { };

int main()
{
    C c;
    A* a = &c;
    if (dynamic_cast<I*>(a))
        std::printf("it's a C\n");
    else
        std::printf("it's not a C\n");
    return 0;
}

请注意public声明中的第二个C

答案 2 :(得分:1)

首先将其投放到C,然后您知道 I

A* pA= A::GetInstance();
if(!pA)
    return;

if( C* pC = dynamic_cast<C*>(pA) ) {
    I* pI= dynamic_cast<I*>(pC);
    if(!pI) return; // unnecessary, but you can keep it
    .
    .
    .
    /// do your thing with pI here
    .
    .
    .
}