わかりました、これは私をとても混乱させる簡単な例です...
class First { public: void Func() {cout<<"FirstFunc";} };
class Second : public First
{ public: void Func() {cout<<"SecondFunc";} };
class Third : public Second
{ public: void Func() {cout<<"ThirdFunc";} };
int main () {
Third * thirdptr = new Third();
Second * secondptr = thirdptr;
First * firstptr = secondptr;
firstptr->Func(); // prints out FirstFunc
secondptr->Func(); // prints out SecondFunc
thirdptr->Func(); // prints out ThirdFunc
delete thirdptr;
そして、これは仮想関数を使用しています
class First { public: virtual void Func() {cout<<"FirstFunc";} };
class Second : public First
{ public: virtual void Func() {cout<<"SecondFunc";} };
class Third : public Second
{ public: virtual void Func() {cout<<"ThirdFunc";} };
int main () {
Third * thirdptr = new Third();
Second * secondptr = thirdptr;
First * firstptr = secondptr;
firstptr->Func(); // prints out ThirdFunc
secondptr->Func(); // prints out ThirdFunc
thirdptr->Func(); // prints out ThirdFunc
delete thirdptr;
わかりました、これが私の質問です。
Third * thirdptr = new Third(); の読み方 new は、「new int」のときに int にメモリを割り当てますが、new Third(); をどのように読み取るべきかわかりません。コンストラクタなので
Second * secondptr = thirdptr; / 最初 * firstptr = secondptr; これらの 2 つのステートメントは非常に紛らわしいです。& 演算子またはアドレス演算子に関連する簡単な言葉で説明できる人はいますか? このポインタと継承の概念は理解できましたが、この部分が非常にややこしいです。
2 番目の例の結果を取得するにはどうすればよいですか? 私が読んでいる本は言っている
最初の例 // ポインター算術演算に関する C++ コンパイラーは、 // ポインターが実際に何を指しているかではなく、ポインターの型に基づいて決定を行います
2 番目の例 // VIRTUAL FUNCTION : ポインターの型に基づいてではなく、 // ポインターが実際に何を指しているかに基づいて何を呼び出すかを決定します
これは翻訳なので、正確ではないかもしれませんが、それでも理解できません。あなたが私を助けることができれば、私は本当に感謝します!