如何理解这个例子?(有关虚函数)
class cdoc
{
void func()
{serialize();}
virtual void serialize()
{cout<<"cdoc::serialize";}
}
class cmydoc:public cdoc
{
virtual void serialize()
{cout<<"cmydoc::serialize";
}
void main()
{
cmydoc mydoc;
((cdoc*)(&mydoc))->func();
((cdoc)mydoc).func();
}
结果分别为cmydoc::serialize和cdoc::serialize
第二个结果为何这样?
问题点数:30、回复次数:5Top
1 楼xyzboat(一叶小舟)回复于 2001-03-12 11:59:00 得分 0
这个问题其实是有虚函数的特点决定的:
当用一个指向基类的指针访问一个虚函数时,C++要根据该指针在运行时指向的对象类型来确定访问哪个函数.
Top
2 楼sun2000(非常可乐)回复于 2001-03-12 12:08:00 得分 0
虚函数本来就是这么回事Top
3 楼wanghu(不懂就是不懂)回复于 2001-03-12 12:55:00 得分 0
我想问的是:
两个方法为何不同?Top
4 楼RedFire(丹焰)回复于 2001-03-12 14:25:00 得分 0
很简单,一个用的是指针,一个没有用!虚函数的实现有关键的两点,virtual以及指针或者引用调用。Top
5 楼joke100(咱们去SLEEP吧...)回复于 2001-03-12 14:33:00 得分 30
实际中需要在不同类层次中对同一种行为做出不同的响应,为了使程序代码有更高的独立性,对同一种行为使用同样的方法名称,但究竟做出什么样的响应由类自己提供,这就是C++中虚函数最动人的地方.
((cdoc)mydoc).func();这一句使用强制转换把cmydoc类型的对象转换成了cdoc类型对象,这种对对象实体的强制转换的结果是对象实体被切片,也就是说派生类多出的一块被干掉,只剩下基类那么大小,比如基类对象大小为8个字节,派生类对象为10个字节(一定不小于基类对象),那么派生类对象切片后由原来的10个字节变成了8个字节!!!
一般来讲应用虚函数应当使用对象的指针来进行,这样才能得到C++的运行时绑定特性.
最常见的应用是这样的:
cmydoc mydoc;
cdoc* pDoc = &mydoc;
pDoc->func(); // 这一句执行的是cmydoc的func,就是运行时绑定,不会破坏对象
Top




