好的,先上示例代码;这是我试图传达我正在尝试做的事情的尝试,尽管它无法编译:
#include <iostream>
template <class T>
class Base
{
public:
virtual void my_callback() = 0;
};
class Derived1
: public Base<int>
, public Base<float>
{
public:
void my_callback<int>()
{
cout << "Int callback for Derived1.\n";
}
void my_callback<float>()
{
cout << "Float callback for Derived\n";
}
};
class Derived2
: public Base<int>
, public Base<float>
{
public:
void my_callback<int>()
{
cout << "Int callback for Derived2.\n";
}
void my_callback<float>()
{
cout << "Float callback for Derived2\n";
}
};
int main()
{
{
Derived1 d;
Base<int> * i_p = d;
Base<float> * i_f = d;
i_p->my_callback();
i_f->my_callback();
}
{
Derived2 d;
Base<int> * i_p = d;
Base<float> * i_f = d;
i_p->my_callback();
i_f->my_callback();
}
//Desired output:
// Int callback for Derived1.
// Float callback for Derived1
// Int callback for Derived2.
// Float callback for Derived2
system("Pause");
}
因此,我正在尝试做的是制作一种可继承的包装类,它将自动将派生类连接到各种回调列表;它需要将派生类的特定实例连接到列表,我希望“用户”拥有/获得将回调函数作为创建派生类的一部分,如您所见。
看起来这应该可以工作,尽管我可能需要使用不同的语法。如果不行,您有什么建议吗?
最佳答案
是的,你可以做到这一点:
#include <iostream>
using namespace std;
template <class T>
class Base
{
public:
virtual void my_callback() = 0;
};
class Derived1 : public Base<int>, public Base<float>
{
public:
void Base<int>::my_callback() {
cout << "Int callback for Derived1.\n";
}
void Base<float>::my_callback() {
cout << "Float callback for Derived\n";
}
};
class Derived2 : public Base<int>, public Base<float>
{
public:
void Base<int>::my_callback() {
cout << "Int callback for Derived2.\n";
}
void Base<float>::my_callback() {
cout << "Float callback for Derived2\n";
}
};
int main()
{
{
Derived1 d;
Base<int> * i_p = &d;
Base<float> * i_f = &d;
i_p->my_callback();
i_f->my_callback();
}
{
Derived2 d;
Base<int> * i_p = &d;
Base<float> * i_f = &d;
i_p->my_callback();
i_f->my_callback();
}
}
输出:
Int callback for Derived1.
Float callback for Derived
Int callback for Derived2.
Float callback for Derived2
关于c++ - 用专门的版本覆盖多个继承的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897675/