【问题标题】:Can I override a virtual function with a pure virtual one?我可以用纯虚拟函数覆盖虚拟函数吗?
【发布时间】:2016-02-05 05:33:24
【问题描述】:

我有三个班级:BDGDBGDBD 都是抽象的。 B 来自第三方。

B 有一个非纯虚方法,G 需要实现(成为D)。我可以将虚函数重新定义/覆盖为纯虚函数吗?

例子:

class B // from a third party
{
public:
   virtual void foo();
};

class D : public B
{
public:
   void foo() override = 0; // allowed by gcc 4.8.2
   virtual void bar() = 0;
};

class G : public D
{
public:
   // forgot to reimplement foo
   void bar() override;
};

int main()
{
   G test;  // compiler error is desired
}

对于“我可以吗?”的问题gcc 允许,但我没有术语/词汇来验证该行为是标准的一部分还是未定义并且恰好在今天起作用。

【问题讨论】:

    标签: c++ c++11 virtual language-lawyer pure-virtual


    【解决方案1】:

    你问:

    我可以用纯虚函数覆盖虚函数吗?

    答案是:是的,你可以。来自 C++11 标准:

    10.4 抽象类

    5 [ 注意: 抽象类可以派生自非抽象类,纯虚函数可以覆盖非纯虚函数。 —尾注 ]

    【讨论】:

    • 我并没有真正理解答案。 G中的方法foo()是不是纯虚的?
    • @BЈовић,是的。 fooG 中是纯虚拟的。
    【解决方案2】:

    如果您使用更现代的编译器编译代码,那么您将收到以下解释问题的错误消息

    prog.cc:23:6: error: variable type 'G' is an abstract class
       G test;  // compiler error is desired
         ^
    prog.cc:10:9: note: unimplemented pure virtual method 'foo' in 'G'
       void foo() override = 0; // allowed by gcc 4.8.2
            ^
    1 error generated.
    

    至于标准(10.3 虚函数)

    11 应定义在类中声明的虚函数,或 在该类中声明为纯(10.4),或两者兼而有之;但没有诊断 必需 (3.2)。

    【讨论】:

    • 是的,我想要这个错误(如果编译器支持整个范例并且对其他程序员来说是合理的)。
    • @jtoker 但是从编译器消息中可以看出,gcc 4.8.2 的行为有所不同。
    • “不需要诊断”。这是否意味着编译器可以毫无错误地接受这个?如果是这样,编译后的代码会做什么?
    • @PieterNuyts 该程序将不正确。
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2013-10-04
    • 1970-01-01
    • 2021-09-30
    • 2022-01-13
    • 2020-08-21
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多