C++无法声明变量为抽象类型。

3

我正在使用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;
}

我的问题是,既然我已经在类模板drived2中覆盖了纯虚函数,为什么drived2仍然是一个抽象类?我该如何消除这个错误。
谢谢 :)

离题:应该叫“派生”,而不是“驱动”。 - Simon Kraemer
谢谢您的评论。我已经修改了它 :) - Casualet
2个回答

14

由于 derived2::baseOut 不是 const,因此您尚未覆盖 base::baseOut

void baseOut() const { }
//             ^^^^^
同样的情况也适用于 derived2::derivedOut
你应该养成使用 override 来捕获这些错误的习惯。
结果:

同样的情况也适用于 derived2::derivedOut

你应该养成使用 override 来捕获这些错误的习惯。

void baseOut() override { }       // Error, overrides nothing!
void baseOut() const override { } // OK

在这个问题上,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;
                     ^

0

函数的重载还取决于该函数的常量性。

请参阅http://www.geeksforgeeks.org/function-overloading-and-const-functions/

在您的代码中:

virtual void baseOut()const =0; - 常量函数

void baseOut(){} - 非常量函数。

因此,它不是函数重写(您所期望的),而是函数重载。这导致derived2也成为抽象类,因为两个虚拟函数没有函数定义。


baseOut没有被重载,而是被隐藏了。即使不考虑类变成抽象类的问题,只有通过使用usingconst版本重新加入重载集合后,派生类才能看到它。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接