手机上次摔了一下,感觉最近不是男生对我很好但没感觉用了,想知道可靠的手机维修公司

如何实现:A类中创建并使用了B类嘚对象现在写一个C类继承B类,同时A类也被修改为创建C类 [问题点数:20分结帖人leamus]

确认一键查看最优答案?

本功能为VIP专享开通VIP获取答案速率将提升10倍哦!

现在想扩展B类的,但是不修改A类使A类init函数创建C类的对象,如何能实现呢

现在能想到的解决方案有2个:模板类(得公开源代码)和回调函数(将init修改为回调,太麻烦)不知有没有什么奇淫技巧来实现呢~谢谢

模板类应该能满足吧,A和B类不需要要公开源代碼派生类按照各自需求实现即可。

模板类应该能满足吧A和B类不需要要公开源代码,派生类按照各自需求实现即可

谢谢!不过我的例孓可能不恰当,因为A类没有类似init函数去创建B类A是内部自己管理B类的创建和释放的,所以没办法把模板参数传递进去...

用模板类的话只能把整个A类都作为模板不过这样得把所有代码暴露出来。

不行啊前提是不能更改A类代码(init函数等)。

既然A类不能修改,且内部管理B类那么无法让A去管理扩展的C了,因为既然new的是B类就不可能动态让B变成C类了。

从外部直接创建个C实例然后设置pB即可


既然A类不能修改,且内蔀管理B类那么无法让A去管理扩展的C了,因为既然new的是B类就不可能动态让B变成C类了。

其实如果不用类模板就得想办法在创建B类对象时跳转到其他地方下功夫。回调函数是个好办法不过受你的启发用模板类、类厂和重载函数来优雅的实现了这个办法(其实核心仍然是跳轉,只是代码比回调函数好看些)大体实现如下:

创建一个类厂F,成员函数ceate来创建B类对象;

把F类的指针f定义在A中把A类所有创建B类对象,都改为为f.create();

写C类派生A类然后用另一个类厂FF派生F类,重写create内容是创建C类对象;

将FF的对象赋值给A对象的f指针。

虽然比较麻烦但是用起來还是挺方便的~

甚至可以把F和FF写到A类内,FF做成模板类会更方便哈哈~


无论如何都是B对象了,没有办法把它改成C对象


即便A里面的pB是pulic的 泹是能随意把它delete掉,或者用新的函数替代init函数来完成b的创建吗

这个还是取决于A已有的实现方式

如果A在构造的时候就内部调用了init完成了pB的初始化,并做了其他的一些关联性操作你就没法替换他

你可以继承A,再弄一套数据管理出来 但是那还是A吗? 某种意义上是复制了一套噺的出来

A是你自己的代码或者开源的,是可以改造;

如果来自他人的系统没有源码级的改造,只能在继承类上想办法

能否实现还是取决于A的具体实现方式, A是完全能堵死这些可能性的

有些商业软件就是这样, 它的对象禁止再继承禁止再修改内部数据类型。 

我最初嘚构想就是做个框架框架实现了一些通用的功能,还可以在不修改源码的情况下再次扩展功能c++语言想要跳出原来代码去执行扩展代码洅返回,也想来想去也就是回调函数、派生类和模板类了但模板类必须开源整个类,还不如直接修改源码;回调函数方便效率高,但鈳读性差也容易出错刚才想到的那个办法比较优雅,其实是用到了c++的动态性特性创建对象时用一个类厂对象去创建,扩展功能后重新繼承派生那个类厂这样就动态的去创建了B的派生对象C。而C对象由于继承自类B所以完全不影响A的内部运行。

举个例子一个列表实现就鈳以用这个方法,list类管理多个node对象用户可以将自己的数据保存在node类的派生类中。

禁止类的继承比较简单 直接用类厂造就行把各种构造函数都做成private。

如果pB是可以在A的对象初始化或者其他阶段通过传参进入的那么你的扩展非常容易

大不了把B的一些方法虚化(virtual),甚至B本身嘟可以是个纯虚类实际使用的时候用B的派生类, A调用B的这些方法就没有顾忌了

那些标准的模板是怎么样的包括你说的回调函数, 其实嘟把数据做活了 让B类的方法和数据不由A控制死

是的,B函数只是框架最基础的功能然后客户可以扩展一些数据,甚至可以写逻辑

匿名鼡户不能发表回复!

我要回帖

更多关于 男生对我很好但没感觉 的文章

 

随机推荐