C++一道关于继承虚函数的题目,求大神解答,感激不尽 40

1002.HumanwithSkinColorTotal:38Accepted:26TimeLimit:1secMemoryLimit:256MBDescriptionT... 1002. Human with Skin Color

Total: 38 Accepted: 26

Time Limit: 1sec Memory Limit:256MB
Description

The class Human is defined as follows:

class Human {
public:
virtual string getSkinColor() = 0;
};

You are to derive two classes European and African from Human, with the skin colors "white" and "black" respectively.

Your submitted source code should include the whole implementation of the classes European and African, but without the class Human.
No main() function should be included.
展开
 我来答
碧血玉叶花
2015-06-02 · TA获得超过4976个赞
知道大有可为答主
回答量:6154
采纳率:0%
帮助的人:1710万
展开全部
类中如果含有虚函数的话就会有一个隐藏的指针,叫做虚函数指针表头指针(后面用p代替),该指针指向了一个虚函数指针表,该表中存储了类中所有虚函数的地址,其存储顺序就是类中虚函数声明的顺序;
首先B继承自A,就含有了两个虚函数g、f;
然后B自己实现了一个g,于是虚函数指针表的第一项本来指向A::g,现在改为指向B::g,B又包含了一个h;
所以最后,B中的虚函数指针表存储的就是B::g A::f B::h。
pFun = ( Fun )*( ( int* ) * ( int* )( &b ) + i );
&b就是取出p的地址,
然后* ( int* )( &b )就是强制转换为int*类型再解析出来,就是将p转换为int类型,
但p本来是指针,所以又转为int*类型,这个时候得到的就是指向了B::g的地址的int*指针,也就是虚函数指针表的第一个元素的int*指针,
再进行加i是就会按照逐个指向虚函数指针表中后面的元素,
( Fun )*( ( int* ) * ( int* )( &b ) + i ),*将上面的int*指针解析出来,也就得到了表中对应元素的值,( Fun )将这个值转换为Fun类型,最终结果赋给pFun;
最后调用各个函数。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式