假設我有一些類似的東西:
class Base {
public:
Base(int value) : value_(value) {}
int getValue() const { return value_; }
private:
int value_;
};
class Derived : public Base {
public:
// Derived only has non-virtual functions. No added data members.
int getValueSquared() const { return value_ * value_; }
}
我執行以下操作:
Base* base = new Base(42);
Derived* derived = static_cast<Derived*>(base);
std::cout << derived->getValueSquared() << std::endl;
嚴格來說,這是UB。實際上,它工作得很好。
來自 Base 的實際數據成員(例如,int value_
)必須位於相同的偏移量,無論對像是實際的Base
還是實際的Derived
(否則,祝你好運)。並且getValueSquared()
不是Derived
實例實際內存佔用的一部分,因此它不會從內存中的 Base 對像中“丟失”或未構建。
我知道 UB 是我不需要這樣做的全部原因,但從邏輯上講,它似乎總是有效。那麼,為什麼不呢?
我問是因為這似乎是一個有趣的怪癖討論......不是因為我打算在生產中使用它。
在實踐中,大多數編譯器會將非虛成員函數轉換為帶有隱藏this
參數的靜態函數。只要函數不使用任何不屬於基類的數據成員,它就可能會起作用。
UB 的問題在於你無法預測它。昨天有效的東西今天可能會失敗,背後沒有韻律或原因。編譯器在如何解釋技術上未定義的任何內容方面有很大的自由度,而尋找更好優化的競賽意味著意外的變化可能會突然發生。墨菲定律說,當您向最重要的老闆或最大的客戶演示軟件時,這些變化將最為明顯。
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras