Codeproject の Don Clugstonの記事を読んでいました。美品でかなり有名です。次のコード スニペットでは、理解するのが非常に難しい特定の概念が見つかりました。
class A {
public:
virtual int Afunc() { return 2; };
};
class B {
public:
int Bfunc() { return 3; };
};
// C is a single inheritance class, derives only from A
class C: public A {
public:
int Cfunc() { return 4; };
};
// D uses multiple inheritance
class D: public A, public B {
public:
int Dfunc() { return 5; };
};
スニペットの後には、次の段落が続きます。
クラス C のメンバー関数ポインターを作成するとします。この例では、Afunc と Cfunc はどちらも C のメンバー関数であるため、メンバー関数ポインターは Afunc または Cfunc を指すことができます。しかし、Afunc には C::A を指す this ポインター (これを Athis と呼びます) が必要ですが、Cfunc には C を指す this ポインター (これを Cthis と呼びます) が必要です。コンパイラの作成者は、この状況にトリックで対処します。つまり、A が C の先頭に物理的に格納されるようにします。これは、Athis == Cthis を意味します。心配する必要があるのは 1 つだけです。世界は順調です。
私が理解したい唯一のことは、上記の段落の BOLD と ITALICS の行です。
Afunc には C::A へのポインターが必要であるのに対し、Cfuncには C へのポインターが必要であることは完全には理解できません。
どんな助けでも大歓迎です。