怎么在基类里调用派生类的函数。

stxl1164584a2 2012-08-12 07:17:08

class A
{

};
class B:public A
{
public:
void speek();

};
能够用A调用speak()吗?
...全文
3820 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunancjz 2013-08-12
  • 打赏
  • 举报
回复
这个问题我也思考过,後来试验发现可以,方法同以上讨论的思想差不多,不过我最先想到的是调用派生类的静态函数。
lanpangbuxueda 2012-08-24
  • 打赏
  • 举报
回复
我就是想知道,lz为什么会有这样的想法呢?
小大小丑 2012-08-24
  • 打赏
  • 举报
回复
静多态
charliezheng198893 2012-08-23
  • 打赏
  • 举报
回复
class B::speak();行不
ying0620 2012-08-23
  • 打赏
  • 举报
回复
什么意思呢?>>.... 怎么好像把OOD里面的依赖倒转原则反过来了, 本来只依赖基类A, cast的时候却不得不依赖B,
BlackGhost 2012-08-21
  • 打赏
  • 举报
回复
不要放在构造函数里误导人啊,A构造时B还没有构造呢
[Quote=引用 11 楼 的回复:]

C/C++ code

#include <stdio.h>

template <typename T>
class A
{
public:
A()
{
T *pT = (T *) this;
pT->speek();
}
};

class B : public A<B>
{
public:
void speek(……
[/Quote]
flchinazjzs 2012-08-21
  • 打赏
  • 举报
回复
A* pa = new B();
B* b = dynamic_cast<B*>(pa);
b->speak();

这样是可以的,但有个条件,类A里面必须要有个虚拟函数,比如定义个virtual void eat(){},这样就行,否则编译会报 'A' is not a polymorphic type。
zzl_acg 2012-08-20
  • 打赏
  • 举报
回复

class A {
public:
void call() { func(); }
protected:
std::function<void(void)> func;
};
class B : class A{
public:
B():{ func = std::bind(&B::speek, this); }
void speek();
};
int main() {
A a;
B b;
a.call(); // do nothing
static_cast<A>(b).call(); // call B::speek;
}

可能有些许语法错误,但大致思路就是这样。
用到的手法叫type erasure,std::function是type erasure的一种实现。

这里的func要多存一些东西,所以还不是特别好。
不过因为基类不可能知道哪些是派生类,所以用function其实思路比较正常。
这里不一定要是派生类,也不一定是某个虚函数,比如有
void B::speak1()和 void B::speak2(),两个可以选一个赋给func,不需要继承自virtual void A::speak();
只要函数签名符合就行了。

zhiyu90 2012-08-20
  • 打赏
  • 举报
回复
用组合 和 聚合 应该可以的
  • 打赏
  • 举报
回复
这么设计有意义吗
副组长 2012-08-19
  • 打赏
  • 举报
回复
反自然的命题。
我就经常想,一条蛇吞了自己的尾巴,一直吞,吞到了蛇头,再吞到自己的嘴,嘴吞嘴是神马?
Walker123654 2012-08-18
  • 打赏
  • 举报
回复
买本书方便自己查阅,多实践
做游戏的小明 2012-08-17
  • 打赏
  • 举报
回复
其实这本质上属于多态问题,平时用的virtual都是动态多态,这个比较常见,而楼主的问题可以归到静态多态里,编译过程当中进行选择,上面给出的模板方法就是静态多态的一种实现方法。

btw,如果没有特别的必要,还是按正常方式写比较好,否则害人害己啊...
luuillu 2012-08-16
  • 打赏
  • 举报
回复
union可以取代类型转换


class A;
class B;
union Helper
{
A *pa;
B *pb;
};
class A
{
public:
void test();

};
class B:public A
{
public:
void speek()
{
cout<<"speek"<<endl;
}

};

void A::test()
{
Helper hp;
hp.pa=this;
hp.pb->speek();

}

zjwdmlmx 2012-08-16
  • 打赏
  • 举报
回复
这只是一种技术,谁能能说说它的实际应用价值,以及对于设计,和维护有什么好处,如果没有果断禁用
ScanerKi 2012-08-15
  • 打赏
  • 举报
回复
这种转换经常用的,一般实现桥接模式的时候都或多或少要用到这种转换
再见理想~ 2012-08-15
  • 打赏
  • 举报
回复
有违面向对象,就像你老爹想调用你的JJ,可能么,
stxl1164584a2 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 的回复:]
父类要调用子类的方法,即父类要依赖子类,这种类体系设计存在很大的问题,还要非要证明如何能实现这种方法。
出现这种情况,类体系设计的人就要看看自己的体系是不是存在问题了。
[/Quote]学习学习,但不一定要用!
god402093272 2012-08-14
  • 打赏
  • 举报
回复
不可以 A和B没有一毛钱关系 这和向下传导相似 不过没听多成员函数的传导
gogogo 2012-08-14
  • 打赏
  • 举报
回复
父类要调用子类的方法,即父类要依赖子类,这种类体系设计存在很大的问题,还要非要证明如何能实现这种方法。
出现这种情况,类体系设计的人就要看看自己的体系是不是存在问题了。
加载更多回复(33)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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