【发布时间】:2020-11-05 05:24:33
【问题描述】:
我想覆盖模板派生类中的虚函数。但是,我想使用派生类作为返回类型。下面是对应的代码:
class Abstract {
public:
virtual Abstract* allocate() const = 0;
};
template <typename Derived>
class Base : public Abstract {
public:
Derived* allocate() const override {
return new Derived;
}
};
class Concrete : public Base<Concrete> {
public:
};
int main() {
Concrete c;
delete c.allocate();
}
不幸的是,我的编译器无法识别 Derived 实际上是从 Abstract 派生的,并且失败并显示以下错误消息。
mwe.cpp: In instantiation of ‘class Base<Concrete>’:
mwe.cpp:12:25: required from here
mwe.cpp:8:14: error: invalid covariant return type for ‘Derived* Base<Derived>::allocate() const [with Derived = Concrete]’
Derived* allocate() const override {
^~~~~~~~
mwe.cpp:3:23: note: overridden function is ‘virtual Abstract* Abstract::allocate() const’
virtual Abstract* allocate() const = 0;
^~~~~~~~
将allocate 函数移动到Concrete 类中可以解决问题,但在创建多个具体类时会导致代码重复。有没有办法让编译器知道Derived 实际上是从Abstract 派生的?
【问题讨论】:
标签: c++ inheritance types