【发布时间】:2013-12-16 14:15:22
【问题描述】:
我需要使用脚本生成类的一些成员/方法。我试图将这个类分成两部分,基类是生成的成员,派生类有手工编码的成员。但是,我一直在弄清楚如何从基类 B::f1() 调用派生成员函数 D::f2()。
这里是简化的代码:
#include <cstdio>
template <typename _T>
class B {
public:
void f3() {
puts("okay");
}
void f1() {
f2(); // What C++ Magic to call f2() properly !!!
}
};
class D : public B<D> {
public:
void f2() {
f3();
}
};
int main() {
D d;
d.f1();
}
有什么办法,不使用虚函数就可以从B::f1()调用D::f2()吗?
稍后添加:
如果我们进行指针操作,最终会导致注入,我知道这不是一个好主意,我会接受不这样做的建议。让我们停止那个线程。
我正在尝试仅使用模板找到解决方案。我可以生成任何复杂的东西 对于生成的代码。它甚至可以是几个仿函数等。但是手工编码 书面部分应该是可手工编码的。
【问题讨论】:
-
dynamic_cast<_t>(this)->f2(); 怎么样? (不要把这个写成答案,因为需要正确的格式和更多关于如何存在更严重问题的扩展答案)
-
@UldisK - 没有虚函数,所以 dynamic_cast 不起作用!
-
你不应该像
_T那样使用reserved names。 -
@Vardhan - 如果您不想使用虚拟功能来解决此类问题,那么您将不得不使用某种折衷的解决方案。您可以避免使用类型参数将派生名称注入基类,就像我在回答中所做的那样。
-
@Vardhan 只要您调用仅在派生类中定义的
f2(),您就可以将派生类“注入”到基类中。