【发布时间】:2012-02-19 13:03:21
【问题描述】:
我有一个类模板,其中一些方法被定义为虚拟方法,以便我的类的用户能够在他的派生类中为它们提供实现。请注意,在我的模板类中,有一些使用虚拟方法的非虚拟方法(应该返回值的虚拟类在非虚拟类中被调用)。
你能给我一个正确代码的简单示例,其中父类的虚拟方法应该返回一个值(但它的实现是在子类中提供的)并且父类中的虚拟方法返回的值是在该类的其他方法中使用。因为我在某个地方(例如这里:Safely override C++ virtual functions)看到这可能会导致一些问题,并且用户定义的方法会注意覆盖父类的虚拟方法。
注意:我使用 g++ 编译器使用 Code::Blocks 进行编程。
编辑:按照这里的要求,我想要一个简单的例子:
template<typename T>
class parent {
public:
// Public methods that user can call
int getSomething(T t);
void putSomething(T t, int x);
// public method that user should implement in his code
virtual float compute(T t) { }
// protected or private methods and attributes used internally by putSomething ...
float doComplexeThings(...); // this can call
};
compute() 方法应该由用户(子类)实现。但是,例如 putSomething() 和 doComplexeThings() 调用了这个方法 compute()。
【问题讨论】:
-
对于您所描述的,可能不需要虚拟方法(静态多态性可能对您有用)-很难根据您的描述来判断。请发布您编写的示例代码,以便我们更好地了解您正在尝试做什么。
-
链接问题中的示例是关于您认为是覆盖但实际上由于错误而声明重载的内容,例如一个 const 缺失,与返回值无关。你认为到底有什么危险?
-
在经典模板代码中,您甚至不需要声明
virtual float compute(T t)。如果您有实例的句柄,您只需通过t.compute()在 putSomething() 和 doComplexeThings() 中使用它(调用它)。如果你的类 T 没有实现计算,编译器会出错。这样,parent 和 T 实际上甚至不必生活在同一个继承层次结构中:即 T 是 parent 关系的 child 是不需要的。这样做也可以让你有机会给父母一个更有意义的名字(因为 is-a 关系不是必需的)。 -
@kfmfe04 我不明白你为什么要谈论 T 和父母之间的关系。 T 不一定是类,它只是类模板(父)使用的类型,因为我想让它独立于操作数据的类型。忘了T,我的问题只是:在哪里以及如何定义
doComplexeThings(...)和putSomething(...)调用的方法float compute(...),而方法float compute(...)的代码应该由用户给出。
标签: c++ inheritance overriding virtual-functions