Merge pull request #206 from CYP12138/master
编译器优化sizeof,private继承访问权限更改
This commit is contained in:
commit
47397be663
@ -93,7 +93,7 @@ int main()
|
|||||||
/**
|
/**
|
||||||
* @file geninhe.cpp
|
* @file geninhe.cpp
|
||||||
* @brief 1.普通单继承,继承就是基类+派生类自身的大小(注意字节对齐)
|
* @brief 1.普通单继承,继承就是基类+派生类自身的大小(注意字节对齐)
|
||||||
* 注意:类的数据成员按其声明顺序加入内存,与访问权限无关,只看声明顺序。
|
* 注意:类的数据成员按其声明顺序加入内存,无访问权限无关,只看声明顺序。
|
||||||
* 2.虚单继承,派生类继承基类vptr
|
* 2.虚单继承,派生类继承基类vptr
|
||||||
* @author 光城
|
* @author 光城
|
||||||
* @version v1
|
* @version v1
|
||||||
@ -117,7 +117,14 @@ class A
|
|||||||
* int b
|
* int b
|
||||||
* short a
|
* short a
|
||||||
* long b
|
* long b
|
||||||
* 根据字节对齐4+4=8+8+8=24
|
* 根据字节对齐4+4+8+8=24
|
||||||
|
*
|
||||||
|
* 或编译器优化
|
||||||
|
* char a
|
||||||
|
* short a
|
||||||
|
* int b
|
||||||
|
* long b
|
||||||
|
* 根据字节对齐2+2+4+8=16
|
||||||
*/
|
*/
|
||||||
class B:A
|
class B:A
|
||||||
{
|
{
|
||||||
@ -125,24 +132,30 @@ class B:A
|
|||||||
short a;
|
short a;
|
||||||
long b;
|
long b;
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 把A的成员拆开看,char为1,int为4,所以是1+(3)+4+1+(3)=12,()为字节补齐
|
||||||
|
*/
|
||||||
class C
|
class C
|
||||||
{
|
{
|
||||||
A a;
|
A a;
|
||||||
char c;
|
char c;
|
||||||
};
|
};
|
||||||
|
|
||||||
class A1
|
class A1
|
||||||
{
|
{
|
||||||
virtual void fun(){}
|
virtual void fun(){}
|
||||||
};
|
};
|
||||||
class C1:public A1
|
class C1:public A
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
cout<<sizeof(A)<<endl; // 8
|
cout<<sizeof(A)<<endl; // 8
|
||||||
cout<<sizeof(B)<<endl; // 24
|
cout<<sizeof(B)<<endl; // 16 或 24
|
||||||
cout<<sizeof(C)<<endl; // 12
|
cout<<sizeof(C)<<endl; // 12
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 对于虚单函数继承,派生类也继承了基类的vptr,所以是8字节
|
* @brief 对于虚单函数继承,派生类也继承了基类的vptr,所以是8字节
|
||||||
*/
|
*/
|
||||||
|
@ -25,7 +25,14 @@ class A
|
|||||||
* int b
|
* int b
|
||||||
* short a
|
* short a
|
||||||
* long b
|
* long b
|
||||||
* 根据字节对齐4+4=8+8+8=24
|
* 根据字节对齐4+4+8+8=24
|
||||||
|
*
|
||||||
|
* 或编译器优化
|
||||||
|
* char a
|
||||||
|
* short a
|
||||||
|
* int b
|
||||||
|
* long b
|
||||||
|
* 根据字节对齐2+2+4+8=16
|
||||||
*/
|
*/
|
||||||
class B:A
|
class B:A
|
||||||
{
|
{
|
||||||
@ -33,6 +40,9 @@ class B:A
|
|||||||
short a;
|
short a;
|
||||||
long b;
|
long b;
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 把A的成员拆开看,char为1,int为4,所以是1+(3)+4+1+(3)=12,()为字节补齐
|
||||||
|
*/
|
||||||
class C
|
class C
|
||||||
{
|
{
|
||||||
A a;
|
A a;
|
||||||
@ -51,7 +61,7 @@ class C1:public A
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
cout<<sizeof(A)<<endl; // 8
|
cout<<sizeof(A)<<endl; // 8
|
||||||
cout<<sizeof(B)<<endl; // 24
|
cout<<sizeof(B)<<endl; // 16
|
||||||
cout<<sizeof(C)<<endl; // 12
|
cout<<sizeof(C)<<endl; // 12
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,14 +1,30 @@
|
|||||||
一、公有继承
|
一、公有继承
|
||||||
1.基类中protected的成员
|
1.基类中protected的成员
|
||||||
类内部:可以访问
|
类内部:可以访问,
|
||||||
类的使用者:不能访问
|
类的使用者:不能访问,
|
||||||
类的派生类成员:可以访问
|
类的派生类成员:可以访问,
|
||||||
2.派生类不可访问基类的private成员
|
2.派生类不可访问基类的private成员
|
||||||
3.派生类可访问基类的protected成员
|
3.派生类可访问基类的protected成员
|
||||||
4.派生类可访问基类的public成员
|
4.派生类可访问基类的public成员
|
||||||
|
|
||||||
|
基类 public继承 派生类
|
||||||
|
|
||||||
|
public -> public
|
||||||
|
|
||||||
|
protected -> protected
|
||||||
|
|
||||||
|
private -> 不可访问
|
||||||
|
|
||||||
二、私有继承
|
二、私有继承
|
||||||
派生类不可访问基类的任何成员与函数
|
派生类也不可访问基类的private成员
|
||||||
|
|
||||||
|
基类 private继承 派生类
|
||||||
|
|
||||||
|
public -> private
|
||||||
|
|
||||||
|
protected -> private
|
||||||
|
|
||||||
|
private -> 不可访问
|
||||||
|
|
||||||
三、保护继承
|
三、保护继承
|
||||||
派生方式为protected的继承称为保护继承,在这种继承方式下,
|
派生方式为protected的继承称为保护继承,在这种继承方式下,
|
||||||
@ -16,6 +32,14 @@
|
|||||||
基类的protected和private成员在派生类中保持原来的访问权限
|
基类的protected和private成员在派生类中保持原来的访问权限
|
||||||
注意点:当采用保护继承的时候,由于public成员变为protected成员,因此类的使用者不可访问!而派生类可访问!
|
注意点:当采用保护继承的时候,由于public成员变为protected成员,因此类的使用者不可访问!而派生类可访问!
|
||||||
|
|
||||||
|
基类 protected继承 派生类
|
||||||
|
|
||||||
|
public -> protected
|
||||||
|
|
||||||
|
protected -> protected
|
||||||
|
|
||||||
|
private -> 不可访问
|
||||||
|
|
||||||
|
|
||||||
四、派生类对基类成员的访问形式
|
四、派生类对基类成员的访问形式
|
||||||
1.通过派生类对象直接访问基类成员
|
1.通过派生类对象直接访问基类成员
|
||||||
|
Loading…
Reference in New Issue
Block a user