参考:
http://www.mamicode.com/info-detail-864409.html
class my
{};
int main()
{
my data;
cout<<sizeof(data)<<endl;
}
当我们建立一个类,类中什么数据也没定义,建立该类的一个对象,可以测试其对象所占的字节数为1。
class my
{
char b;
};
int main()
{
my data;
cout<<sizeof(data)<<endl;
}
这个类中只有一个char型数据,占一个字节。
class my
{
char b;
short a[7];
};
int main()
{
my data;
cout<<sizeof(data)<<endl;
}
my类中char类型占1个字节,short类型每个占2个字节,考虑到字节对齐的原因,这个类的一个对象占16个字节。
class father
{
virtual void function(){};
};
class child:public father
{
};
int main()
{
father data_f;
child data_c;
cout<<sizeof(data_f)<<endl;
cout<<sizeof(data_c)<<endl;
}
父类father中存在虚函数,子类child继承父类。父类和子类对象中都存在一个指针,指向虚函数表。所以sizeof(data_f)为4,sizeof(data_c)为4。
#include <iostream>
using namespace std;
class animal
{
protected:
int age;
public:
virtual void print_age(void) = 0;//纯虚函数
};
class dog : public animal
{
public:
dog(){this -> age = 2;}
~dog(){}
virtual void print_age(void){cout<<"Wang, my age = "<<this -> age<<endl;}
};
class cat: public animal
{
public:
cat(){this -> age = 1;}
~cat(){}
virtual void print_age(void){cout<<"Miao, my age = "<<this -> age<<endl;}
};
int main(void)
{
cat kitty;//1
dog jd;//2
animal * pa;//3
int * p = (int *)(&kitty);//4
int * q = (int *)(&jd);//5
p[1] = q[1];//6
pa = &kitty;//7
pa -> print_age();//8
<span style="white-space:pre"> </span>pa=&jd;//9
<span style="white-space:pre"> </span>pa->print_age();//10
return 0;
}
第1行定义了cat类的一个对象kitty,这将调用cat::cat()构造函数。
第2行定义了dog类的一个对象jd,这将调用dog::dog()构造函数。
第3行:定义了一个基类指针,因为类animal中含有纯虚函数,所以不能定义animal类的对象。
第4行:先是用&符号取得对象kitty的地址,并使用强制类型转换把对象指针转化为int 类型的指针。
第5行:先是用&符号取得对象jd的地址,并使用强制类型转换把对象指针转化为int类型的指针。
第6行:
p和q是分别指向kitty和jd两个对象的首地址,因为类Cat和Dog都包含虚函数,所以kitty和jd两个对象均包含一个虚函数表,并通过一个指针指向它,p[0]和q[0]就是该虚函数表指针,而p[1]和q[1]则为该对象的数据成员即age的值,p[1] = q[1];将kitty的age被修改为2。
第7、8:
pa指针声明时的类型为基类animal,它指向派生类kitty对象,典型的多态特性,则pa的静态类型为animal,动态类型为cat。
而print_age()是虚函数,因此是动态绑定,动态绑定指向是动态类型的成员,因此调用的是kitty的成员函数print_age()。
第9、10:
pa指针声明时的类型为基类animal,它指向派生类jd对象,典型的多态特性,则pa的静态类型为animal,动态类型为dog。
而print_age()是虚函数,因此是动态绑定,动态绑定指向是动态类型的成员,因此调用的是jd的成员函数print_age()。
#include "stdio.h"
class Base
{
public:
int Bar(char x)
{
return (int)(x);
}
virtual int Bar(int x)
{
return (2 * x);
}
};
class Derived : public Base
{
public:
int Bar(char x)
{
return (int)(-x);
}
int Bar(int x)
{
return (x / 2);
}
};
int main(void)
{
Derived Obj;
Base *pObj = &Obj;
printf("%d<span style="white-space:pre"> </span>", pObj->Bar((char)(100)));
printf("%d<span style="white-space:pre"> </span>", pObj->Bar(100));
}
输出100 50
Derived Obj;
Base *pObj = &Obj;
printf("%d,", pObj->Bar((char)(100)))
printf("%d,", pObj->Bar(100));
第一个Bar(char)是非虚函数,因此是静态绑定,静态绑定是指指针指向声明时的对象,pObj声明时为Base类,因此调用的是Base类的Bar(char)
第二个Bar(char)是虚函数,因此是动态绑定,动态绑定是指指针指向引用的对象,pObj引用Derived对象,因此调用的是Derived类的Bar(int)