【发布时间】:2009-12-10 16:58:50
【问题描述】:
我有一个关于 C++ 模板的问题。更具体地说,通过使用模板参数进行继承。 我在封闭源代码的 3rd 方库中面临奇怪的行为。有一个C方法
factoryReg(const char*, ICallback*)
允许注册 ICallback 的子类并覆盖(简化的)方法:
class ICallback
{
public:
virtual void ENTRY(void* data) = 0;
virtual void EXIT(void* data) = 0;
const char* getName() { return _name; } const
ICallback(const char* name) : _name(name) {}
virtual ~ICallback() {}
private:
const char* _name;
};
我有
class BaseCallback : public ICallback
{
public:
BaseCallback(const char* name) : ICallback(name) {}
virtual void ENTRY(void* data) {
std::cout << "in ENTRY base" << std::endl;
}
virtual void EXIT(void* data) {
std::cout << "in EXIT base" << std::endl;
};
class SpecialCallback : public BaseCallback
{
public:
SpecialCallback(const char* name) : BaseCallback(name) {}
virtual void ENTRY(void* data) {
// actually, it's 3rd party code too - assumed to do something like
...
BaseCallback::ENTRY();
}
// no redecl. of EXIT(void* data)
};
template <typename Base>
TemplCallback : public Base
{
public:
TemplCallback(Base& myT) : Base(myT.getName()), _myT(myT)
virtual void ENTRY(void* data) {
std::cout << "in ENTRY templ." << std::endl;
_myT.ENTRY();
}
virtual void EXIT(void* data) {
std::cout << "in EXIT templ." << std::endl;
_myT.EXIT();
}
private:
Base& _myT;
}
注册后
SpecialCallback spc("validName");
TemplCallback<SpecialCallback> myCallback(spc);
factoryReg(spc.getName(), &myCallback);
...
// output: "in ENTRY base"
// "in EXIT base"
回调不知何故不起作用(调试输出未输出 // 断点不适用)。
如果我在模板类 TemplCallback 中省略了 EXIT(void* data) 方法的实现 - 一切正常!
// output: "in ENTRY templ."
// "in EXIT base"
这是预期的行为吗?有人告诉我这可能是我使用的 MSVC 编译器 13.10.6030 的问题。不确定。
顺便说一句:这里提出的模板想法可能不是我想做的任何事情的最佳选择;) 但我仍然对这件事本身感兴趣,不管设计问题。
【问题讨论】:
-
你能把这个 pidgin C++ 充实到至少有希望编译的东西吗?用伪代码做语言律师很难。
-
对不起,我意识到代码有点薄:现在充实它。
标签: c++ inheritance templates visual-c++