Допустим, у меня есть два файла:
/**
* class.cpp
*/
#include <stdio.h>
class foo
{
private:
int func();
};
int foo::func(void)
{
printf("[%s:%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
и
/**
* main.cpp
*/
#include <stdio.h>
namespace foo
{
int func(void);
}
int main(void)
{
int ret = foo::func();
printf("[%s:%d]: ret=%d\n", __FILE__, __LINE__, ret);
return 0;
}
скомпилирован следующим образом:
g++ -o a.out main.cpp class.cpp
Существует вывод из исполняемого файла:
[class.cpp:15]: func
[main.cpp:14]: ret=-1
И наконец мой вопрос:
Почему этот примерный код скомпилирован без каких-либо ошибок, и мы можем вызвать метод private класса класс foo?
Скомпилирован с gcc 4.6.3, но не только. Я знаю, что компилятор не различает эти два символа (func) из пространства имен foo и частной функции foo из класса foo б > ). Выход из nm:
nm class.o
00000000 T _ZN3foo4funcEv
00000017 r _ZZN3foo4funcEvE12__FUNCTION__
U printf
nm main.o
U _ZN3foo4funcEv
00000000 T main
U printf
Я хотел бы спросить, правильно ли это поведение или нет? ИМХО это неправильное поведение, и оно вообще небезопасно (разрушает инкапсуляцию).
Я хотел бы упомянуть, что компилятор из visual studio 2008 не связывает эти два символа.