阿里机试题目_虚函数

参考:

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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值