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

本文共 1946 字,大约阅读时间需要 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.

转载于:https://www.cnblogs.com/AndyJee/p/4578586.html

你可能感兴趣的文章
Blob(二进制)、byte[]、long、date之间的类型转换
查看>>
OO第一次总结博客
查看>>
day7
查看>>
iphone移动端踩坑
查看>>
vs无法加载项目
查看>>
Beanutils基本用法
查看>>
玉伯的一道课后题题解(关于 IEEE 754 双精度浮点型精度损失)
查看>>
《BI那点儿事》数据流转换——百分比抽样、行抽样
查看>>
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
机器学习降维之主成分分析
查看>>
CTP2交易所成交回报
查看>>
WebSocket & websockets
查看>>