基本クラスのペアがあるとします。
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
{
};
次のような main 関数を使用します。
int main()
{
B* myD = new D();
B* myF = new F();
A* myA = new G();
myD->foo(myA);
myF->foo2(myA);
return 0;
}
わかりました、これが「恐ろしいダイヤモンド」であるという明白な事実を無視します (これにより、「複数の As」の問題は回避されましたvirtual
)。一般的な考え方は、すべてのオブジェクトを G、D、および F にしたいということですが、 As および Bs への参照として格納されます。B の (実際には常に D または F のいずれかである) 仮想関数を使用して G の値を変更できるようにしたいのですが、A と B は子クラスを認識していないため、使用して宣言することはできません。彼ら。これは、仮想関数の引数が常に A へのポインターでなければならないことを意味します。ただし、D は入力が常に C であることを望んでおり、F は入力が E であることを望んでいます。G が1 つの親からのみ継承し、現在の G は 2 つの親から継承しています。方法がわからないthis
ポインターは、実際にはこのような状況の根底にあるコンテキストで機能します...しかし、これが可能な状況になるとは思いません。
親/子クラスへのポインターをキャストするメカニズムに光を当てることをいとわない人はいますか?また、これを実現する方法があれば?