C++不能将变量声明为抽象类型

Cas*_*let 3 c++

我正在使用C++模板,我得到了上面的错误.

我的代码如下:

#include <iostream>
#include <string>
using namespace std;
enum type{ONE,TWO,THREE,FOUR,FIVE};

class base{
public:
    virtual void baseOut()const =0;
};
template<class T>
class derived:public base{
    virtual void drivedOut()const=0;
};

template<class T,type>
class derived2:public derived<T>{
    public:
    void baseOut(){}
    void drivedOut(){}

};

int main(){
    derived2<string,ONE> d;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,由于我已经在类模板drived2中覆盖了纯虚函数,为什么drived2仍然是一个抽象类?如何删除此错误.

谢谢:)

Que*_*tin 14

你没有覆盖base::baseOut,因为derived2::baseOut是非const!

void baseOut() const { }
//             ^^^^^
Run Code Online (Sandbox Code Playgroud)

同样的道理derived2::derivedOut.

你应养成override用来捕捉这些错误的习惯.

void baseOut() override { }       // Error, overrides nothing!
void baseOut() const override { } // OK
Run Code Online (Sandbox Code Playgroud)

Clang在这一方面比GCC更有帮助:

main.cpp:18:14: warning: 'derived2<std::__cxx11::basic_string<char>, type::ONE>::baseOut'
                hides overloaded virtual function [-Woverloaded-virtual]
        void baseOut(){}
             ^

[...]

main.cpp:8:22: note: hidden overloaded virtual function 'base::baseOut' declared here:
               different qualifiers (const vs none)
        virtual void baseOut()const =0;
                     ^
Run Code Online (Sandbox Code Playgroud)