【发布时间】:2014-08-27 16:53:35
【问题描述】:
在用 C++ 编写模板基类时,这是一个关于样式和安全性的相当普遍的问题。不过,请耐心等待,最后有一个具体问题......
我有一个模板基类,当类型 T 是原始类型(int、float 等)时,它完全实现了所需的功能。但是,如果 T 不是原始的(例如,如果 T 是一个需要使用一组特定参数调用构造函数的类),则需要重写某些方法,因此它们在模板。模板还包含一个纯虚方法,它强制它是抽象的,因此为了使用它必须从以下位置派生:基于原始类型的派生类可以使用提供的所有方法,并且只覆盖纯虚拟方法,而基于非原始类型的派生类应该覆盖所有虚拟方法。
例如:
template <typename T> class myTemplate
{
public:
// Constructor:
myTemplate<T>();
// Destructor:
virtual ~myTemplate();
// General function, valid for all classes derived from this:
void printMe()
{
printf("Hello, I'm from the template\r\n");
}
// Primitive function, must be overridden for non-primitive types:
virtual T DoSomething(const T& myClass)
{
T result = result + static_cast<T>(1);
return result;
}
// Primitive function, must be overridden for non-primitive types:
virtual T DoSomethingElse(const T& myClass)
{
T result = result - static_cast<T>(1);
return result;
}
// Pure Virtual function, must be overridden in all cases:
virtual void RefrainFromDoingAnythingAtAll(const T& myClass) = 0
};
class myIntegerClass : public myTemplate<int>
{
public:
virtual void RefrainFromDoingAnythingAtAll(const int& myInteger) {}
};
假设现在我想创建一个派生类,我希望在其中调用“DoSomething”,但无法设想在任何情况下“DoSomethingElse”会有用。因此,我想重新实现“DoSomething”,但不打扰“DoSomethingElse”。然而,如果在某个时候派生类的“DoSomethingElse”方法确实被调用(或者是因为我真的想调用“DoSomething”但错误地写了错误的东西,或者因为出现了我遇到的情况之前没有想到),然后我想发出一个编译器警告来提醒我,除非我先重新实现 'DoSomethingElse',否则我不能这样做。
例如:
class myWatermelonClass : public myTemplate<Watermelon>
{
public:
virtual Watermelon DoSomething(const Watermelon &myWatermelon)
{
// Just return a copy of the original:
Watermelon anotherWatermelon(myWatermelon);
return anotherWatermelon;
}
virtual Watermelon DoSomethingElse(const Watermelon &myWatermelon)
{
// This routine shouldn't ever get called: if it does, then
// either I've made an error or, if I find that I really need
// to reimplement it after all, then I'd better buckle down
// and do it.
< How do I make the compiler remind me of this? >
}
virtual void RefrainFromDoingAnythingAtAll(const Watermelon& myWatermelon) {}
};
显然我知道标准的#error 和#warning 编译器指令,但是如果我使用其中之一,那么每次编译时都会标记错误(或警告)。我想要的是确保在我疏忽调用时在编译时给出错误
DoSomethingElse(aSpecificWatermelon);
来自我代码中的某处,但不是其他情况。有没有办法做到这一点?或者这只是一个根本上糟糕的设计?
【问题讨论】:
-
你检查过纯虚方法吗?
-
“基于原始类型的派生类可以使用提供的所有方法并仅覆盖纯虚拟方法,而基于非原始类型的派生类应覆盖所有虚拟方法” -看起来您应该为非原始类型使用从 myTemplate 继承的单独类。在 mytemplate 中,所有虚函数都应该是纯函数,除一个之外的所有函数都应该在新类中实现。
标签: c++ templates inheritance compiler-errors pragma