假设我有一对基类:
class A
{};
class B
{
virtual void foo(A* ref);
virtual void foo2(A* ref);
};
从他们那里,一些派生类:
class C : virtual public A
{
int data;
};
class D : public B
{
virtual void foo(A* ref)
{
((C*) (ref)).data = 5;
}
};
class E : virtual public A
{
int otherData;
};
class F : public B
{
virtual void foo2(A* ref)
{
((E*) (ref)).otherData = 6;
}
};
最后,我们有一个类似的类,如下所示:
class G : public E, public C
{
};
主要功能如下:
int main()
{
B* myD = new D();
B* myF = new F();
A* myA = new G();
myD->foo(myA);
myF->foo2(myA);
return 0;
}
好吧,忽略一个明显的事实,即这是一个“可怕的钻石”(由于 virtual
,“multiple As”问题已被避免),一般的想法是我想要我所有的对象都是 Gs、Ds 和 Fs,但存储为对 As 和 Bs 的引用。我希望能够使用 B(实际上总是 D 或 F)的虚函数来修改 G 的值...但是,A 和 B 不知道它们的任何子类,因此不能使用声明他们。这意味着虚函数参数必须始终是指向 A 的指针。但是,D 希望它的输入始终是 C,而 F 希望它的输入是 E。如果 G 是,这可能不是问题仅继承自一个 parent ,我们当前的 G 继承自 2 个 parent ;我不知道 this
指针在这种情况的底层上下文中实际上是如何工作的……但是,我认为这不会成为可能的情况。
是否有人愿意阐明将指针转换到父类/子类的机制,是否有任何方法可以实现这一点?
最佳答案
假设您打开了 RTTI(您很可能这样做),您可以使用 dynamic_cast 尝试将基类指针向上转换为派生(或同级)类指针。引用的对象在运行时被测试以查看它是否是一个兼容的类,如果这不是一个有效的向上转换,它将返回 0,在这种情况下您可以测试它和分支。
关于c++ - 多重继承类引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10944106/