c++的虚函数的局限性??麻烦高人进来指点一下
定义基类base ,以及虚函数test
再定义继承自base的子类child,以及虚函数test
然后
child c;
base* tb = %c;
此时调用b->test执行child中的test
然后
base bb = *tb
base* tbn = &bb
此时调用tbn->test执行base中的test
问题是,此刻我仍然希望tbn执行的是child中的test,该怎么办?
换而言之,一旦我们将子类强制保存为父类,其就失去了其原有类型的信息。这是不是虚函数的局限性呢?
问题点数:50、回复次数:14Top
1 楼ox_thedarkness()回复于 2006-03-13 11:24:03 得分 5
- - 问题是你为什么要构造 base bb = *tb; ?
注意这里是构造了一个新的对象,而且这个对象本身比他的派生类要小,会丢失所有新增的数据成员。你如何期望他能正确携带派生类的全部信息?
你可以用 base& bb 或者 base* pb。
唯一的可能是,你期望用 base 容器比如 vector 或者数组解决问题 —— 那么肯定办不到:装不下。 这种情况还是用 vector< base* > vect 或者 base* ar[]; 这样的容器把。Top
2 楼wshcdr(dd)回复于 2006-03-13 11:26:24 得分 0
base bb = *tb
base* tbn = &bb
////////////
base bb = *tb
base* tbn = &&bb;
child* pChild = reinterpre_cast<child*>(tbn)
if(pChild)
...Top
3 楼popy007(Twinsen)回复于 2006-03-13 11:26:48 得分 20
base bb = *tb
这句话会发生object slicing,也就是将派生类的对象
削剪成为base类的对象,失去所有child类型信息。
这种问题的解决方法就是将base做成抽象类,在这种情况下
base就不能够实例话而导致object slicing的发生。
Top
4 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-13 13:24:41 得分 0
虚函数挺好的。Top
5 楼lionwys(lionwys)回复于 2006-03-14 10:10:13 得分 0
popy007:
你说的方法不是等于不可行么?Top
6 楼cunsh(村少)回复于 2006-03-14 10:51:03 得分 10
楼主想做什么呀?Top
7 楼cunsh(村少)回复于 2006-03-14 10:52:02 得分 0
如果能像楼主想的那样.那不是要天下大乱呀.Top
8 楼lionwys(lionwys)回复于 2006-03-14 11:17:08 得分 0
我想新建一组类,他们继承一个抽象基类。
而后我声明的对象全部保存在抽象类数组中。
但我此刻又需要对这个数组中的内容进行深度拷贝,即获取一个新的具有同样功能的数组。。。
Top
9 楼ox_thedarkness()回复于 2006-03-14 11:30:45 得分 0
“而后我声明的对象全部保存在抽象类数组中”
显然不可能。大小都不一致,你怎么放得下。
改成:
“保存在抽象类指针数组中”
比较好。Top
10 楼popy007(Twinsen)回复于 2006-03-14 11:56:04 得分 0
lionwys(lionwys)
==
object slicing应该尽量避免。
你的要求应该用virtual function来实现,也就是pass by pointer or reference,
而不是by value。Top
11 楼iGray(i_冲锋陷阵)回复于 2006-03-14 14:30:58 得分 10
然后
base bb = *tb
base* tbn = &bb
此时调用tbn->test执行base中的test
问题是,此刻我仍然希望tbn执行的是child中的test,该怎么办?
//---------------------------------
多态,是通过虚函数表实现的。只能在指针(或引用)时发生。即根据“所指(或所引用的)对象的实际类型”调用相应的虚函数。
base* tbn = &bb;//你看看,tbn指向的bb为base类型,当然不会执行child中的虚函数了
//=================================
我想新建一组类,他们继承一个抽象基类。
而后我声明的对象全部保存在抽象类数组中。
但我此刻又需要对这个数组中的内容进行深度拷贝,即获取一个新的具有同样功能的数组。。。
楼主你想法,看来就是想说接口这个概念。
定义一纯虚类,来实现一组接口规范,一些子类从该接口派生。当然,数组中保存的是指针或引用。
Top
12 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-14 16:22:42 得分 5
给base提供一个clone接口
child c;
base* tb = &c;
此时调用b->test执行child中的test
base* tbn = tb->clone(); //clone的 内部 return new MY_TYPE(*this);
tbn->test(); //仍然是child的test
delete tbn;
tbn = 0;
Top
13 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-14 16:25:50 得分 0
漏了一点,如果clone是开放的...那最好用智能指针.不然就复杂咯~~~~~Top
14 楼lionwys(lionwys)回复于 2006-03-15 13:28:39 得分 0
ok clone谢谢啦,我了解了Top




