我有一個有趣的問題,爬起來,我想知道爲什麼GCC/G ++沒有抓住這個並拋出某種錯誤。同一個名稱導致vtable問題的多個類
道歉這有多少文件,但我儘可能減少了這個問題。
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();
};
Ç lass2.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();
}
輸出
g++ Class1.C Interface.C main.C Class2.C
./a.out
Calling Hello
正如你可以在上面看到,即使我構建Class2
,它打印從Class1
輸出。這是因爲在兩個Class1
和Class2
虛函數表的HelloClass
有)相同的地址HelloClass ::你好(和它的功能是在Class1.C
,因爲當海灣合作委員會正在做鏈接,它看到vtables的類與相同的mangled名稱,只是丟棄其中之一。但是它應該警告這個嗎?甚至導致錯誤。我曾嘗試使用-Wall和-Wextra,但沒有提及。
使用命名空間? – Prabhu
謝謝,我明白如何解決它,只是想知道爲什麼它不抱怨 – Salgar