为什么新版本的C++不允许在类声明中定义纯方法?

问题描述:

为什么MSVC++ 2015和其早期版本允许一个pure virtual method的定义在类声明内,但在GCC 4.9,我想MSVC++ 2017不允许:为什么新版本的C++不允许在类声明中定义纯方法?

#include <iostream>  

    class A{ 
     public: 
      virtual void Foo() = 0; 
    }; 

    class B: public A { 
     public: 
      virtual void Foo() = 0 { std::cout << "B::Foo()" << std::endl; 
      }; // Allowed on MSVC 2015 and old versions 

      //virtual void Foo() = 0; // on newer versions 
    }; 

    //void B::Foo(){ 
    // std::cout << "B::Foo()" << std::endl; 
    //}  // Ok here! 

    class C : public B{ 
     public: 
      void Foo(){ 
       B::Foo(); 
       std::cout << "C::Foo()" << std::endl; 
      } 
    }; 

    int main(){ 

    // A aObj; // error 
    // B bObj; // error 
     C cObj; // correct 
     cObj.Foo(); 

     std::cout << std::endl; 
     std::cin.get(); 
     return 0; 
    } 
+1

我不认为语言语法严格地允许它。我同意它应该。 –

+0

@NeilButterworth:该程序在MsvC++ 2015上顺利运行! – Raindrop7

+1

可能是因为MSVC没有实现在标准中描述的语法 - 大多数编译器都没有。 –

standard明确提到,这是不允许的(例如, C++ 14,第10.4节/ 2)

函数声明不能​​同时提供纯说明符和一个 定义 - 注完] [实施例:结构13 C {虚拟无效F()= 0 { }; // ill-formed}; - 结束示例]