以下代碼編譯並正常工作,允許我訪問受保護的類的字段。但這是一件好事嗎?覺得髒,但我知道什麼從Java未來:可以濫用reinterpret_cast將對象轉換爲派生類時,它不是?
#include <iostream>
class Base {
public:
Base() : _f(42) {
}
int getF() { return _f; }
protected:
int _f;
};
class Der : public Base {
public:
void setF(int f) { _f = f; }
};
int main(int argc, char ** argv) {
Base *b = new Base();
std::cout << b->getF() << std::endl;
Der *d = reinterpret_cast<Der*>(b);
d->setF(37);
std::cout << b->getF()<< std::endl;
}
如果我是正確的,這是不正常,什麼是一個好辦法揭露的對象通常不需要的內部封裝的數據字段需要修改,但需要在測試中進行更改?該實例在其他組件內部深處創建,因此更改其類型不是微不足道的。
雖然我看不到這個吹起來是未定義的行爲。 – NathanOliver
請參閱[這裏](http://en.cppreference.com/w/cpp/language/reinterpret_cast),列出您可以使用'reinterpret_cast'做的事情。 –
沒有好的辦法來打破法律。 –