Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change pure virtual to virtual and stay binary compatible

Can I change a pure-virtual function (in a base class) to become non-pure without running into any binary compatibility issues? (Linux, GCC 4.1)

thanks

like image 950
mr grumpy Avatar asked Jul 19 '11 14:07

mr grumpy


2 Answers

There is no compatibility issues when you switch from pure virtual to virtual and then re-compile the code. (However, virtual to pure virtual may cause problems.)

The only thing you should take care is, that the non-pure virtual methods must have a body. They cannot remain unimplemented. i.e.

class A {
public:
  virtual int foo ()
  {
    return 0; //put some content
  }
};

You cannot simply put like,

virtual int foo();

It will cause linker error, even if you don't use it.

like image 198
iammilind Avatar answered Oct 17 '22 13:10

iammilind


What does it mean to maintain binary compatibility to you?

The object layout will be the same, but you will be breaking the One Definition Rule unless you recompile all code, at which point binary compatibility is basically useless. Without recompiling, then the ODR is broken, and while it might be the case that it works, it might also not work.

In particular if all of the virtual methods in the class are either pure or defined inline, then the compiler might generate the vtable in each translation unit that includes the header and mark it as a weak symbol. Then the linker will pick one of them and discard all the others. In this situation the linker is not required to verify that all of the vtables are exactly the same and will pick one at random (or deterministically in an undefined way), and it might pick one such vtable where the method is pure virtual, which in turn might end up crashing the application if the method is called on an object of the base class.

like image 36
David Rodríguez - dribeas Avatar answered Oct 17 '22 12:10

David Rodríguez - dribeas