Here’s a class with an undefined method. It seems compilers allow instances of this class to be constructed, so long as the undefined member function is never called:
struct A {
    void foo();
};
int main() {
    A a;      // <-- Works in both VC2013 and g++
    a.foo();  // <-- Error in both VC2013 and g++
}
Here’s a similar situation, but one that involves inheritance. Subclass Bar extends base class Foo. Foo defines a method g(). Bar declares the same-named method but does not define it:
#include <iostream>
struct Foo {
    void g() { std::cout << "g\n"; }
};
struct Bar : Foo {
    void g();
};
int main() {
    Bar b;      // Works in both VC2013 and g++
    b.Foo::g(); // Works in both VC2013 and g++
    b.g();      // Error in both VC2013 and g++
}
Here's a variation of the above. The only difference here is that g() is virtual to both Foo and Bar:
#include <iostream>
struct Foo {
    virtual void g() { std::cout << "g\n"; }
};
struct Bar : Foo {
    virtual void g();
};
int main() {
    Bar b;      // Works in g++. But not in VC2013, which gives
                // 'fatal error LNK1120: 1 unresolved externals'
    b.Foo::g(); // Works in g++, but VC2013 already failed on b's construction
    b.g();      // Error in g++, but VC2013 already failed on b's construction
}
See the code comments for contrast of different behavior between VC2013 and g++.
- Which compiler is correct, if any?
- Why does VC2013's compiler have some different complaints in its version with the virtualkeyword compared to the one in its version without thevirtualkeyword?
- Are unused undefined methods always allowed? If not, what are all the cases in which they're not allowed?
- Does Bar’s declaration ofg()count as overriding even whenBardoesn't provide a definition?
 
     
    