c++ - Multiple classes with the same name causing vtable problems -
i have interesting problem crept , wondering why gcc/g++ doesn't catch , throw kind of error.
apologies how many files takes, i've reduced problem as possible.
interface.h
class baseclass { public: virtual void hello() = 0; }; void rememberclass(baseclass* foo); void callfunc();
interface.c
#include "interface.h" namespace { typedef void (baseclass::*memfunptr)(); memfunptr func; baseclass* obj; } void rememberclass(baseclass* foo) { func = &baseclass::hello; obj = foo; } void callfunc() { (obj->*func)(); }
class1.h
class class1 { public: class1(); };
class2.h
class class2 { public: class2(); };
class1.c
#include "interface.h" #include "class1.h" #include <iostream> class helloclass : public baseclass { public: helloclass() {} void hello() { std::cout << "calling hello" << std::endl; } }; class1::class1() { helloclass* foo = new helloclass(); rememberclass(foo); }
class2.c
#include "interface.h" #include "class2.h" #include <iostream> class helloclass : public baseclass { public: helloclass() {} void hello() { std::cout << "calling hello 2" << std::endl; } }; class2::class2() { helloclass* foo = new helloclass(); rememberclass(foo); }
main.c
#include "class2.h" #include "interface.h" int main(int argc, char** argv) { class2 a; callfunc(); }
output
g++ class1.c interface.c main.c class2.c ./a.out calling hello
as can see above, though constructing class2
, prints output class1
. because vtable helloclass
in both class1
, class2
have same address helloclass::hello(), , address of function in class1.c
i'm assuming because when gcc doing linking, sees vtables classes same mangled names , discards 1 of them. should warn this? or cause error. have tried -wall , -wextra nothing mentioned.
no, standard explicitly allows compiler silently wrong thing in case.
explicitly, causing undefined behavior having 2 conflicting definitions same decorated name in same program.
it called odr "one definiton rule".
chapter 3.2.
Comments
Post a Comment