(C ++オブジェクトモデル):このポインターを調整する

目次

このポインター調整

見る

回路図

総括する


このポインター調整

見る

#include <iostream>
using namespace std;

class A {
public:
	int a;
	A()
	{
		printf("A::A()的this指针是:%p!\n", this);
	}
	void funcA()
	{
		printf("A::funcA()的this指针是:%p!\n", this);
	}
};

class B {
public:
	int b;
	B()
	{
		printf("B::B()的this指针是:%p!\n", this);
	}
	void funcB()
	{
		printf("B::funcB()的this指针是:%p!\n", this);
	}
};

class C : public A, public B
{
public:
	int c;
	C()
	{
		printf("C::C()的this指针是:%p!\n", this);
	}
	void funcC()
	{
		printf("C::funcC()的this指针是:%p!\n", this);
	}

	void funcB()
	{
		printf("C::funcB()的this指针是:%p!\n", this);
	}
};


int main()
{
	//this指针调整:多重继承
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;

	C myc;
	myc.funcA();
	myc.funcB(); //已经被子类C覆盖了
	myc.B::funcB();
	myc.funcC();
	return 1;
}
  • 出力結果

回路図

総括する

  • 派生クラスオブジェクトには、基本クラスのサブオブジェクトが含まれます
  • 場合派生クラスが一つだけ基底クラスから継承し、派生クラスのオブジェクトのアドレスは、ベース・クラスのサブオブジェクトのアドレスと同じです
  • ただし、派生クラスオブジェクトが複数の基本クラスを同時に継承する場合は、次のことに注意する必要があります。
    • 最初の基本クラスオブジェクトの開始アドレスは、派生クラスオブジェクトの開始アドレスと同じです。
    • これらの後続の基本クラスサブオブジェクトの開始アドレスと派生クラスオブジェクトの開始アドレスの違いは何ですか?
      • 次に、以前の基本クラスのサブオブジェクトによって占有されていたメモリ空間を取り除く必要があります
  • 概要:あなたサブクラスメンバ関数の呼び出しこのポインタはなり自動的にコンパイラのターゲットに調整するメモリレイアウト開始アドレスのは、それにオブジェクトをサブクラス化すべきです

おすすめ

転載: blog.csdn.net/baidu_41388533/article/details/108646950