g ++ cra sh "чисто виртуальный метод вызван" вместо ошибки компиляции - PullRequest
1 голос
/ 23 марта 2020
#include <iostream>

class A
{
public:
    virtual ~A() = default;
    virtual void foo() const = 0;
};

class C
{
public:
    C(const A &a) : m_a(a) {}
    void bar() const
    {
        std::cout << "in" << std::endl;
        m_a.foo(); //pure virtual method called terminate called without an active exception
        std::cout << "done" << std::endl;
    }

private:
    const A &m_a;
};

int main()
{
    C c({});
    c.bar();
}

приводит к:

$ g++ virtual_crash.cpp
$ ./a.out 
in
pure virtual method called
terminate called without an active exception
Aborted (core dumped)

Мой вопрос заключается в том, почему это работает с g cc?

В C c({}); построить абстрактную A ( ГБД прослеживается). Явное создание этого объекта явно ошибочно. VS2017 дает сбой по той же причине ..

...