我应该如何实现一个纯虚方法与派生类型作为参数
How should I implement a pure virtual method with derived type as parameter?
我正在用c++编写程序,我来自Java,我遇到了一些麻烦。我想有一个基抽象类(java接口),它定义了派生类必须实现的一些方法。这个方法可以有派生类型作为参数,但在这里我发现了一个问题。如果我在基类中将它们定义为基类中的参数,编译器不会将派生类型的重新定义视为重写,派生类仍然是纯虚的。解决这种情况的正确方法是什么?谢谢!
我想你应该这样写:
template<class T>
class Interface {
virtual void Method(T i) = 0;
};
class Implement : public Interface<Implement> {
virtual void Method(Implement i) override {
}
};
您应该做的是在派生类中创建一个以基类为参数的函数。您可以使用dynamic_cast
来确保运行时类型确实是派生类(否则抛出异常)。正如chris在他的评论中提到的,逆变是"困难的"。
class Base
{
public:
virtual void fn(const Base &base)=0;
}
class Derived:public Base
{
void fn(const Base &base)
{
const Derived *derived=dynamic_cast<const Derived *>(&base);
if(derived!=nullptr)
{//code for derived..
}
}
}
如果你真的必须得到你想要的,你应该选择CRTP。我想你真的不需要。如果你真的需要,Adrian的答案就是你要找的。
请记住,如果您选择CRTP,您将失去继承的一些好处。例如,您将无法创建基类指针列表(vector <Base *>
)。当您使用基类(Base<Derived>
)时,您需要选择派生类,这可能会破坏目的。
您正在尝试做的事情在Java中也不起作用。在Java中,返回类型可以是协变的,但不能是方法的参数。如果您考虑Liskov原则,这实际上是有意义的:如果您缩小派生类的契约,您将无法用派生对象替换基对象。
解决方案可能需要在设计层面。只是猜测,但这类问题涉及到您希望对类和参数类型进行分派的情况。如果是这种情况,请查看访问者模式。
相关文章:
- 使用基类中的派生方法运行线程,而无需使用模板
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 使用库中的基础级别中的派生方法
- 如何通过功能指针调用派生方法
- C++ shared_ptr从派生方法返回此值
- C 基本方法称为而不是派生方法
- 可视化C++对象被上投射到基类;无法调用派生方法
- C++ 继承函数指针,可与派生方法一起使用
- 基本方法被调用而不是派生方法
- 正在调用基方法,而不是从构造函数派生方法
- 具有显式派生方法的C++接口
- 正在调用派生方法而不是Base
- 继承方法,派生方法调用的不是基
- 使用不在基类中的派生方法
- 如何使用基指针访问派生方法
- 是否可以显式使用祖先的虚拟类方法作为派生方法?
- 中的派生方法未在基类中调用
- 从基指针调用派生方法
- 从基类调用基类中不存在的派生方法