续 C++多态和对象的内存布局(一)
5. 普通单继承且本身不存在虚函数的继承类的内存布局
程序输出:
sizeof(Base_1) = 12 (成员属性 + 指向虚函数表的指针)
sizeof(Derive_1) = 20 (Base成员属性 + Derive成员属性 + 指向虚函数表的指针)
Base内存布局:
1> class Base_1 size(12):
1> +---
1> 0 | {vfptr}
1> 4 | base1_1
1> 8 | base1_2
1> +---
Base虚函数表:
1> Base_1::$vftable@:
1> | &Base_1_meta
1> | 0
1> 0 | &Base_1::base1_fun_1
1> 1 | &Base_1::base1_fun_2
Derive内存布局:
1> class Derive_1 size(20):
1> +---
1> 0 | +--- (base class Base_1)
1> 0 | | {vfptr}
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
Derive虚函数表:
1> Derive_1::$vftable@:
1> | &Derive_1_meta
1> | 0
1> 0 | &Base_1::base1_fun_1
1> 1 | &Base_1::base1_fun_2
测试代码:
#include<iostream>
#include<string>
using namespace std;
class Base_1
{
public:
int base1_1;
int base1_2;
virtual void base1_fun_1()
{
cout << "virtual void Base_1_fun_1()" << endl;
}
virtual void base1_fun_2()
{
cout << "virtual void Base_1_fun_2()" << endl;
}
};
class Derive_1 : public Base_1
{
public:
int derive1_1;
int derive1_2;
};
int main()
{
cout << endl << "5. 普通单继承且本身不存在虚函数的继承类的内存布局" << endl;
cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;
cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;
return 0;
}
6. 本身存在虚函数基类也存在虚函数
Base内存布局:
1> class Base_1 size(12):
1> +---
1> 0 | {vfptr}
1> 4 | base1_1
1> 8 | base1_2
1> +---
Base虚函数表:
1> Base_1::$vftable@:
1> | &Base_1_meta
1> | 0
1> 0 | &Base_1::Base_1_fun_1
1> 1 | &Base_1::Base_1_fun_2
Derive内存布局:
1> class Derive_1 size(20):
1> +---
1> 0 | +--- (base class Base_1)
1> 0 | | {vfptr}
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
Derive虚函数表:
1> Derive_1::$vftable@:
1> | &Derive_1_meta
1> | 0
1> 0 | &Base_1::Base_1_fun_1
1> 1 | &Base_1::Base_1_fun_2
1> 2 | &Derive_1::Derive_1_fun_1
测试代码:
#include<iostream>
#include<string>
using namespace std;
class Base_1
{
public:
int base1_1;
int base1_2;
virtual void Base_1_fun_1()
{
cout << "virtual void Base_1_fun_1()" << endl;
}
virtual void Base_1_fun_2()
{
cout << "virtual void Base_1_fun_2()" << endl;
}
};
class Derive_1 : public Base_1
{
public:
int derive1_1;
int derive1_2;
virtual void Derive_1_fun_1()
{
cout << "virtual void Derive_1_fun_1()" << endl;
}
};
int main()
{
cout << endl << "6. 本身存在虚函数基类也存在虚函数" << endl;
cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;
cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;
return 0;
}
7. 普通单继承中派生类本身不存在虚函数,是派生类用普通方法重载基类的虚函数
这里只讲内存布局,多态后续详解
程序输出:
sizeof(Base_1) = 12
sizeof(Derive_1) = 20
Base内存布局
1> class Base_1 size(12):
1> +---
1> 0 | {vfptr}
1> 4 | base1_1
1> 8 | base1_2
1> +---
Base虚函数表
1> Base_1::$vftable@:
1> | &Base_1_meta
1> | 0
1> 0 | &Base_1::Base_1_fun_1
1> 1 | &Base_1::Base_1_fun_2
1>
1> Base_1::Base_1_fun_1 this adjustor: 0
1> Base_1::Base_1_fun_2 this adjustor: 0
1>
1> class std::is_error_code_enum<char const *> size(1):
1> +---
1> 0 | +--- (base class std::integral_constant<bool,0>)
1> | +---
1> +---
Derive内存布局:
1> class Derive_1 size(20):
1> +---
1> 0 | +--- (base class Base_1)
1> 0 | | {vfptr}
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
Derive虚函数表
1> Derive_1::$vftable@:
1> | &Derive_1_meta
1> | 0
1> 0 | &Derive_1::Base_1_fun_1 已经被放置到第一位,&Derive_1 由这个可知 Derive_1生命的对象指向的是Derive_1类中的函数Base_1_fun_1。
1> 1 | &Base_1::Base_1_fun_2
测试代码:
#include<iostream>
#include<string>
using namespace std;
class Base_1
{
public:
int base1_1;
int base1_2;
virtual void Base_1_fun_1()
{
cout << "virtual void Base_1_fun_1()" << endl;
}
virtual void Base_1_fun_2()
{
cout << "virtual void Base_1_fun_2()" << endl;
}
};
class Derive_1 : public Base_1
{
public:
int derive1_1;
int derive1_2;
void Base_1_fun_1()
{
cout << "virtual void Derive 重载 Base_1_fun_1()" << endl;
}
};
int main()
{
cout << endl << "6. 本身存在虚函数基类也存在虚函数" << endl;
cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;
cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;
return 0;
}
8. 普通单继承中派生类本身存在虚函数,是派生类用虚函数方法重载基类的普通函数
Base内存布局:
1> class Base_1 size(12):
1> +---
1> 0 | {vfptr}
1> 4 | base1_1
1> 8 | base1_2
1> +---
Base虚函数表:
1> Base_1::$vftable@:
1> | &Base_1_meta
1> | 0
1> 0 | &Base_1::Base_1_fun_1
Derive内存布局:
1> class Derive_1 size(20):
1> +---
1> 0 | +--- (base class Base_1)
1> 0 | | {vfptr}
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
Derive虚函数表:
1> Derive_1::$vftable@:
1> | &Derive_1_meta
1> | 0
1> 0 | &Base_1::Base_1_fun_1
1> 1 | &Derive_1::Base_1_fun_2
#include<iostream>
#include<string>
using namespace std;
class Base_1
{
public:
int base1_1;
int base1_2;
virtual void Base_1_fun_1()
{
cout << "virtual void Base_1_fun_1()" << endl;
}
void Base_1_fun_2()
{
cout << "virtual void Base_1_fun_2()" << endl;
}
};
class Derive_1 : public Base_1
{
public:
int derive1_1;
int derive1_2;
virtual void Base_1_fun_2()
{
cout << "virtual void Derive 重载 Base_1_fun_2()" << endl;
}
};
int main()
{
cout << endl << "8. 本身存在虚函数基类也存在虚函数" << endl;
cout << "sizeof(Base_1) = " << sizeof(Base_1) << endl << endl;
cout << "sizeof(Derive_1) = " << sizeof(Derive_1) << endl << endl;
return 0;
}
未完待续....