博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(笔试题)关于C++的虚函数和多态性
阅读量:6107 次
发布时间:2019-06-21

本文共 1895 字,大约阅读时间需要 6 分钟。

以下两段程序的输出是什么?

程序1:

#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,", pObj->Bar((char)(100)));     printf("%d,", 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)
 

程序2:

#include 
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; dog jd; animal *pa; int *p = (int *)(&kitty); int *q = (int *)(&jd); //cout << p[1] << endl; //cout << q[1] << endl; p[1] = q[1]; pa = &kitty; pa->print_age(); return 0;}

分析:

答案:Miao, my age =2

int*p = (int*)(&kitty);
int*q = (int*)(&jd);
p和q是分别指向kitty和jd两个对象的首地址,因为类Cat和Dog都包含虚函数,所以kitty和jd两个对象均包含一个虚函数表,并通过一个指针指向它,p[0]和q[0]就是该虚函数表指针,而p[1]和q[1]则为该对象的数据成员即age的值,p[1]=1,q[1]=2
 p[1] = q[1]=2;
kitty的age被修改为2,
animal *pa;
pa = &kitty;
pa->print_age();
pa指针声明时的类型为基类animal,它指向派生类kitty对象,典型的多态特性,则pa的静态类型为animal,动态类型为cat。
而print_age()是虚函数,因此是动态绑定,动态绑定指向是动态类型的成员,因此调用的是kitty的成员函数print_age(),
cout << " Miao,my age= " << this->age << endl;
此时age=2.

转载地址:http://kghza.baihongyu.com/

你可能感兴趣的文章
[leetcode]Next Permutation @ Python
查看>>
JAVA(2)——JDBC
查看>>
php heredoc 与 nowdoc
查看>>
DBA_Oracle DBA常用表汇总(概念)
查看>>
第30周二
查看>>
Log4cpp介绍及使用
查看>>
数学类杂志SCI2013-2014影响因子
查看>>
实用的树形菜单控件tree
查看>>
最近公共祖先(lca)
查看>>
【WP 8.1开发】文件选取器的使用方法
查看>>
Java实现BASE64编解码
查看>>
【Java】java基本知识
查看>>
之前学习wordpress的几张图片
查看>>
RT-Thread下的串口驱动程序分析【转载】
查看>>
UITableView的UITableViewStyleGrouped
查看>>
ecshop中getAll ,getOne ,getRow的区别
查看>>
Apple 企业开发者账号申请记录
查看>>
ecshop后台权限增加
查看>>
C#装饰者模式实例代码
查看>>
ASP.NET MVC显示异常信息
查看>>