c++中普通函数调用虚函数有关问题

c++中普通函数调用虚函数问题
今天去面试了,受打击鸟,下面是面试的一道题目(大概),不是很懂,忘解答....
class CA
{
public:
virtual void fun1()
{
cout<<"CA::fun1()"<<endl;
}
void fun2()
{
fun1();
cout<<"CA::fun2()"<<endl;
}
};
class CB:public CA
{
public:
virtual void fun1()
{
cout<<"CB::fun1()"<<endl;
}
void fun2()
{
fun1();
cout<<"CB::fun2()"<<endl;
}
};
void main()
{
CA *p =new CB();
p->fun1();
p->fun2();
}
上面代码输出是什么?有什么bug?如何解决?
我的回答是:因为CA中fun2不是虚函数,而CA *p =new CB()时会进行类型转换,所以输出的结果是
CB::fun1()
CA::fun1()
CA::fun2()
后面被面试官问的很狼狈啊,他的问题大概是:有什么bug,是编译过程、链接过程还是运行过程中会出现问题?
回来后自己运行了下程序,得到的结果是
CB::fun1
CB::fun1
CA::fun2
忘高手详细分析,谢谢

------解决方案--------------------
调试一遍,看看整个执行过程。
------解决方案--------------------
这题我做过,在北京的一家公司。
我当时写的是
delete p;
p = 0;
我后来没被问到笔试题。
这道题应该是笔试的时候做的吧,面试的时候拿着笔试的题问的吗?
我惊异的是楼主能过目不忘?
------解决方案--------------------
第二行输出就是到底调用哪个fun1,由于fun1是虚函数,调用时是由虚函数表中的函数地址决定的,由于
CA *p =new CB();中,虽然p是CA指针,但是他指向的虚函数表是CB的虚函数表(多态),所以调用的虚函数是CB中的虚函数,故第二行打引
CB::fun1

------解决方案--------------------
CB::fun1 还是 CA::fun1 这个地方,其实换句话说,就是问虚函数与重载函数的区别。区别就在这里

------解决方案--------------------
只要是virtual函数调用, 就一定通过this的 虚函数指针 指向 的 虚函数表 去查找.
------解决方案--------------------
bug? 有什么bug?
virtual ~CA() ?
delete p?
try{CA* p = new CB();}?