C ++覆盖虚拟模板方法

时间:2019-05-27 03:39:32

标签: c++ templates inheritance polymorphism override

我试图覆盖C ++中的虚函数。在我覆盖该函数之后,它实际上并未覆盖它,因此使该类成为抽象类。 下面的代码将使您对问题有很好的了解。

正如您在下面看到的那样,该代码对于非指针模板(例如int)可以正常工作,但是由于有int指针而失败。

我认为也许是因为这是指向指针的问题,所以我在实现Derived2的过程中取出了&,但这并没有解决。

template<class T>
class Base {
    virtual void doSomething(const T& t) = 0;
};
class Derived1: public Base<int>{
    void doSomething(const int& t) {
    } // works perfectly
};
class Derived2: public Base<int*>{ 
    void doSomething(const int*& t) { 
    }
// apparently parent class function doSomething is still unimplemented, making Derived2 abstract???
};

int main(){
    Derived1 d1;
    Derived2 d2; // does not compile, "variable type 'Derived2' is an abstract class"
}

1 个答案:

答案 0 :(得分:5)

请注意,对于参数类型const T&constT本身上是合格的,那么当T是类似于int *的指针时,{{ 1}}应该在指针本身(即const)而不是指针对象(即int* const)上得到限定。

正确的类型应该是

const int*

顺便说一句:您可以使用关键字override来确认void doSomething(int* const & t) 函数是否被正确覆盖。

BTW2:将virtual的样式更改为const T&可能会使其更清晰。

LIVE