C++ 如果它在直接层次结构路径之外"is a"类,则已知多重继承
C++ Multiple inheritance known if it "is a" class outside direct hierachy path
我有以下类层次结构
A
|-B I
|-C-|
A 是系统的类;B和C是我自己的。
在系统中还有一个函数,它返回指向 A 实例的指针。
我是一个最小的班级,如果可能的话,甚至没有任何成员。
当我这样做时
A* pA= A::GetInstance();
if(!pA)
return;
I* pI= dynamic_cast<I*>(pA);
if(!pI)
return;
而我的实例是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!
};
class C: public B, I
{ //...
I
是C
的私有基类,因为你没有指定I
的访问权限。 (您的public
仅适用于B
。 因此,类型 C
的对象实际上不是 I
。 dynamic_cast
只能遵循公共继承关系。
如果将其更改为:
class C: public B, public I
{ //...
以下作品:
#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 Cn");
else
std::printf("it's not a Cn");
return 0;
}
请注意C
声明中的第二个public
。
先把它投射到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
.
.
.
}
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 使用多重继承时出现编译错误
- 增强多重继承的序列化
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- C++多重继承和鸭子类型
- C++两次从文件保存对象读取多重继承
- 从多重继承中的派生类函数调用适当的父类函数
- C++ 如果它在直接层次结构路径之外"is a"类,则已知多重继承