代码之家  ›  专栏  ›  技术社区  ›  Donald Duck abhilash-ram

我可以强制C++类为非抽象类吗?

  •  3
  • Donald Duck abhilash-ram  · 技术社区  · 7 年前

    在我的C++程序中,我有一个抽象类,名为 Foo 和一个从中继承的类,名为 Bar 这不应该是抽象的。但我经常在 忘了在 ,这使得 酒吧 也是一个抽象类。所以我经常收到这样的代码:

    class Foo {
    public:
        virtual void someMethod() = 0;
        //Other stuff
    };
    
    class Bar: public Foo {
        //Other stuff, but I forgot to override someMethod
    };
    
    int main(){
        Bar myVariable;    //Error here saying that Bar is abstract
        return 0;
    }
    

    当然,这段代码不会编译,但它会将错误放在第一行 Bar myVariable ,说我不能实例化抽象类(因为我忘了重写 someMethod , 酒吧 是抽象的)。但是我认为如果编译器告诉我忘记重写哪个方法会更有帮助,因为我在这两个方面都有很多其他的东西 酒吧 为了找到我忘记重写的方法,我必须遍历 并确保在 酒吧

    所以我想知道我是否可以告诉编译器 酒吧 不应该是抽象的,因此不需要将编译器错误放在我声明类型变量的行中 酒吧 这么说 酒吧 酒吧 someMethod方法 “。类似这样:

    nonabstract class Bar: public Foo { //Error here, Bar isn't supposed to be abstract but I didn't override someMethod
        //Some stuff
    };
    

    我做了一些研究,发现 final 关键字,该关键字应用于类,因此该类不能被继承。我试着做标记 酒吧 最终的 ,认为拥有一个不能继承的抽象类没有任何意义,但在XCode中,我得到的只是一个警告,说“抽象类被标记为‘final’”(但它仍然没有告诉我忘记重写哪个方法),在Visual Studio中,它没有更改任何内容,甚至没有生成警告。即使它起作用了,也不是完美的,因为我不反对使用继承自的类 酒吧 酒吧 抽象地说。

    有没有办法告诉编译器 酒吧 不应该是抽象的,所以当我忘记重写纯虚方法并告诉我忘记重写哪个方法时,它会给我一个错误?

    3 回复  |  直到 7 年前
        1
  •  9
  •   Sneftel    7 年前

    在某些IDE中,尤其是Visual Studio,“错误”窗口仅显示每个错误的第一行。如果您查看编译器输出,它将显示其他信息(如果可用);在这种情况下,该信息将包括缺少的成员(您可以双击输出行以转到相关的代码行)。我不知道最近有哪个编译器没有告诉你哪些抽象函数没有实现。

        2
  •  7
  •   Sergey Kalinichenko    7 年前

    从C++17开始,您可以使用 static_assert 确保某个类不是抽象的 std::is_abstract<T>

    static_assert(!std::is_abstract<Bar>(), "Bar must be non-abstract.");
    

    这并没有告诉您忘记重写哪些函数,但它允许您在以下情况下中断编译: Bar 未使用。这在以下情况下可能会有所帮助: 酒吧

        3
  •  0
  •   Stephan Lechner    7 年前

    我想你要确保 Bar 不是抽象的,不需要尝试实例化它。为此,您可以使用 static_assert 具有 std::is_abstract :

    class Bar: public Foo {
        //Other stuff, but I forgot to override someMethod
    };
    static_assert(!std::is_abstract<Bar>(), "Bar is ought to be not abstract.");
    

    静态_断言 someMethod (在 酒吧 或在 Foo ),编译器错误将消失。