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

为什么C++的更新版本不允许在类声明中定义纯方法?,c++,oop,chain,C++,Oop,Chain,为什么MSVC++2015及其早期版本允许在类声明中定义纯虚拟方法,但GCC 4.9和我猜MSVC++2017不允许这样做: #include <iostream> class A{ public: virtual void Foo() = 0; }; class B: public A { public: virtual void Foo() = 0 { s

为什么MSVC++2015及其早期版本允许在类声明中定义纯虚拟方法,但GCC 4.9和我猜MSVC++2017不允许这样做:

    #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;
    }
明确提到不允许这样做,例如C++14,§10.4./2

函数声明不能同时提供纯说明符和 定义-结束注释][示例:结构C{virtual void f=0{ };//格式错误};-结束示例]


我不认为语言语法严格允许这样做。我同意它应该是。可能是因为MSVC没有实现标准中描述的语法——大多数编译器都没有。.MSVC++ 2015和C++的早期版本,可能是MSVC + + 2015和MSVC的早期版本。这个语法在C++中是无效的。为什么MSVC有一个bug是一个空洞的问题。这就是生命,它是一个VisualC++语言扩展。VisualC++也有或可能还有一个扩展,您可以在类中重写具有基类版本的类的重写。g++编译器还有其他语言扩展,例如可变长度数组。