2017-09-23 42 views
0

爲什麼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沒有實現在標準中描述的語法 - 大多數編譯器都沒有。 –

回答

7

standard明確提到,這是不允許的(例如, C++ 14,第10.4節/ 2)

函數聲明不能​​同時提供純說明符和一個 定義 - 注完] [實施例:結構13 C {虛擬無效F()= 0 { }; // ill-formed}; - 結束示例]

相關問題