Я тестировал действительность спецификатора доступа private
в С++. Здесь:
Интерфейс:
// class_A.h
class A
{
public:
void printX();
private:
void actualPrintX();
int x;
};
Реализация:
// class_A.cpp
void A::printX()
{
actualPrintX();
}
void A::actualPrintX()
{
std::cout << x:
}
Я построил это в статической библиотеке (.a/.lib). Теперь мы имеем пару class_A.h и classA.a(или classA.lib). Я отредактировал class_A.h и удалил из него private:
.
Теперь в другом классеTester.cpp:
#include "class_A.h" // the newly edited header
int main()
{
A a;
a.x = 12; // both G++ and VC++ allowed this!
a.printX(); // allowed, as expected
a.actualPrintX(); // allowed by G++, VC++ gave a unresolved linker error
return 0;
}
Я знаю, что после вмешательства в заголовок библиотеки все ставки отключены (я имею в виду, системная целостность и т.д.). Хотя метод хакерский, это действительно разрешено? Есть ли способ заблокировать это? Или я здесь что-то не так?