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. 展开
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. 展开
1个回答
展开全部
类中如果含有虚函数的话就会有一个隐藏的指针,叫做虚函数指针表头指针(后面用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;
最后调用各个函数。
首先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;
最后调用各个函数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询