有趣的问题,看看大家有什么说法。

xie987 2004-09-24 12:36:46
class Base
{
public:
Base* pid;
void AddBase(Base* base){
base->pid=this;
}
void test(){
cout<<"this is Base"<<"\n";
}

};


class Derive:public Base
{
public:
void test(){
cout<<"this is Derive"<<"\n";
}

};

class Der:public Base
{
void test(){
cout<<"this is der"<<"\n";
}
};

void main(){
Derive testDerive;
Der testDer;
testDer.AddBase(&testDerive);
testDerive.pid->test();//如何才能调到 Der里的test()? 不用类型转换 不用虚函数。我在基类Base里要怎么改才能实现这样的效果。?
//Base* pid????AddBase(Base* base)//??这几个之间要怎么做
}

我要如何做才能用testDerive.pid->test();这样的方法调到自己想调的函数。

(Base 从一开始设写好后,后以后就不能修改了)我该如何写这个Base 才能使以后继承这个类通过的所有类 通过AddBase (testDer.AddBase(&testDerive); ) 后就可以 testDerive.pid-> 这样来调用 testDer里面的东东呢。
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xie987 2004-09-25
  • 打赏
  • 举报
回复
怎么结贴???
xie987 2004-09-25
  • 打赏
  • 举报
回复
怎么结贴???
xie987 2004-09-25
  • 打赏
  • 举报
回复
感谢 cpunion(int argc, char** argv) 的指导
cpunion 2004-09-25
  • 打赏
  • 举报
回复
一般不会有一个太直接的过程,看看WebService的C++运行库吧,WebService运行过程跟你这个其实是同理:

某个client要调用service方面的一个方法,它们采用约定的方式来交流。因为在client看来,service方面除了可以通过soap rpc来访问以外,其它都未可知。

比如Axis C++、gsoap、ICE(ICE不属WebService平台,但同属RPC的一种实现平台)等生成的源码,你会发现它们生成一个远程调用以后的代码实际上都只是一个固定模式,然后把差异性分散到各个Response和Return类中让它们自行处理。这是一个太复杂的过程,如果你不是要做一个库的话,不建议这么干。
cpunion 2004-09-25
  • 打赏
  • 举报
回复
pid是一个Base指针,想通过它去访问派生类实例的方法?

显然在Base里无法去取得pid的真实类型,RTTI也只是动态类型发现,还未上升到动态方法发现的程度,这在纯动态OO语言里应该叫做自省,C++做不到这点。

C++中办法也是有的,比如MFC的MESSAGE_MAP应该算是一种,而且MFC的MESSAGE_MAP在编译期就已经确定,跟你的情况类似。MFC的CWnd派生类实现了哪些方法,在CWnd层面上也是未知的,所以和你的情况完全吻合。我想MFC的MESSAGE_MAP机制已经是最简单的实现方法了,你可以采用一下。

因为在Base里无法知道Derive里面有哪些方法,所以你要实现的是一个function map从Base里面去通过一个参数找到这里面要调用的一个function。你不能方便地以一个很直接的函数调用来完成,而要从function map里面去寻找这个函数,可能还会遇到函数转型的麻烦,一般都会把这个函数原型设计为一个通用原型,在许多framework、lib里面应该会看到。

xie987 2004-09-24
  • 打赏
  • 举报
回复

daylove(痴迷C++)(初级阶段) 谢谢指导,的方法也行的通,但我想让这个步骤在 基类Base里面实现就是在调用时自己不用再转换test属怀哪个类的了。


metaphor(真流星蝴蝶剑)
谢谢关注,但不能用虚机制,应派生类所添加的函数是未知的,不可能猜到,也不可能全加进来。
metaphor 2004-09-24
  • 打赏
  • 举报
回复
在基类的test前加virtual关键字
daylove 2004-09-24
  • 打赏
  • 举报
回复
testDerive是Derive的一个实列,而Der里的test()是Der的成员函数,Der和testDerive都是从基类继承而来的,testDerive可以调用Der的test()吗?不知道,
如果可以,看这样行不行:testDerive.pid->Der:test();

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧