金山的一道笔试题
#include<iostream>
using namespace std;
struct a
{
};
struct b:public a
{
virtual void m(){cout<<'m';}
};
struct c:public a
{
virtual void n(){cout<<'n';};
};
int main(void)
{
c *p=(c*)new b;
p->n();
system("pause");
return 0;
}
//求程序运行结果
//vc2010编译结果为:m
==========================
金山的一道笔试题。
请问可以这样写吗?
哪位大牛能不能给分析下,谢谢!
[解决办法]
可以,内存结构相同
c *p=(c*)new b;
P真正指向的是B;
p->n();这个只当做是指针的运算即可,实际上是B的偏移位置,实际上调用的是b::m();
所以输出M,表达能力不是很好,凑合着看看吧
[解决办法]
p虚函数表指向的地址是b的函数m
[解决办法]
可以是可以啊~~~~~
强制转换类型。
的确是M,因为是cout<<'m'了,