我有两个类:
struct A {
template <typename T>
void print(T& t){
// do sth specific for A
}
};
struct B : A {
template <typename T>
void print(T& t){
// do sth specific for B
}
};
在这种情况下,不能编译具有虚函数(A和B都继承自虚函数)的更通用基类,因为没有虚for模板。当我尝试在同一“接口”下委托所有A或B对象时,有没有人有办法解决这个问题?提前谢谢你。
诚心诚意,君
发布于 2011-07-22 12:27:06
你可以考虑使用CRTP。
template<typename Derived>
struct Base {
template <typename T>
void print(T& t){
static_cast<Derived*>(this)->print(t);
}
};
struct A : Base<A> {
// template print
};
struct B : Base<B> {
// template print
};
示例用法:
template<typename T, typename ARG>
void foo (Base<T>* p, ARG &a)
{
p->print(a);
}
此方法将被调用为,
foo(pA, i); // pA is A*, i is int
foo(pB, d); // pB is B*, d is double
这是another demo code。
发布于 2012-10-19 18:07:39
使用代理类获取B的方法
class A {
public:
friend class CProxyB;
virtual CProxyB* GetCProxyB() = 0;
};
class B;
class CProxyB
{
public:
CProxyB(B* b){mb = b;}
template <typename T>
void printB(T& t)
{
mb->print(t);
}
B* mb;
};
class B:public A {
public:
virtual CProxyB* GetCProxyB(){return new CProxyB(this);};
template <typename T>
void print(T& t){
printf("OK!!!!!\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a = new B;
CProxyB* pb = a->GetCProxyB();
int t = 0;
pb->printB(t);
return 0;
}
发布于 2011-07-22 10:18:42
有两个选项:
选项一:虚拟化方法,如果用户不提供实现,则使用“基类”。
template <typename T>
struct A {
virtual void print(T& t);
};
template <typename T>
void A::print(T& t) {
// do sth specific for A
}
template <typename T>
struct B : A {
virtual void print(T& t);
};
void B::print(T& t) {
// do sth specific for B
}
选项二:抽象方法,如果用户不提供实现,代码将不会编译。
template <typename T>
struct A {
virtual void print(T& t)=0;
};
template <typename T>
struct B : A {
virtual void print(T& t){
// do sth specific for B
}
};
template <typename T>
void B::print(T& t){
// do sth specific for B
}
除了上面提到的以外,如果你不把它们设为虚的,派生类就会遮蔽基类方法,而这肯定不是你想要的。因此,是不可能的。
https://stackoverflow.com/questions/6784893
复制相似问题