【发布时间】:2012-06-08 06:37:16
【问题描述】:
假设我有一对基类:
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,“多重 As”问题已被避免),一般的想法是我希望我的所有对象都是 Gs , Ds 和 Fs,但存储为对 As 和 Bs 的引用。我希望能够使用 B(实际上总是 D 或 F)虚函数来修改 G 的值......但是,A 和 B 不知道它们的任何子类,因此不能使用声明他们。这意味着虚函数参数必须始终是指向 A 的指针。但是,D 希望它的输入始终是 C,而 F 希望它的输入始终是 E。虽然如果 G 是,这可能不是问题仅从一个父级继承,我们当前的 G 是从 2 个父级继承的;我不知道this 指针在这种情况的底层上下文中实际上是如何工作的……但是,我不认为这是一种可能的情况。
是否有人愿意阐明将指针转换为父/子类的机制,以及是否有任何方法可以实现这一点?
【问题讨论】:
-
实际上,我在这里害怕的不是钻石,而是:1/ 使用未经检查的指针 => 请通过引用传递
ref2/ 使用 C-casts => 请使用适当的 C++ 强制转换(这里可能带有运行时检查)
标签: c++ class multiple-inheritance virtual-functions