在實現一個虛擬賦值運算符的時候,我以一個有趣的行爲結束了遊戲。這不是編譯器故障,因爲g ++ 4.1,4.3和VS 2005共享相同的行爲。爲什麼虛擬分配的行爲與同一個簽名的其他虛擬功能的行爲不同?
基本上,對於實際正在執行的代碼,虛擬運算符=的行爲與任何其他虛擬函數的行爲不同。
struct Base {
virtual Base& f(Base const &) {
std::cout << "Base::f(Base const &)" << std::endl;
return *this;
}
virtual Base& operator=(Base const &) {
std::cout << "Base::operator=(Base const &)" << std::endl;
return *this;
}
};
struct Derived : public Base {
virtual Base& f(Base const &) {
std::cout << "Derived::f(Base const &)" << std::endl;
return *this;
}
virtual Base& operator=(Base const &) {
std::cout << "Derived::operator=(Base const &)" << std::endl;
return *this;
}
};
int main() {
Derived a, b;
a.f(b); // [0] outputs: Derived::f(Base const &) (expected result)
a = b; // [1] outputs: Base::operator=(Base const &)
Base & ba = a;
Base & bb = b;
ba = bb; // [2] outputs: Derived::operator=(Base const &)
Derived & da = a;
Derived & db = b;
da = db; // [3] outputs: Base::operator=(Base const &)
ba = da; // [4] outputs: Derived::operator=(Base const &)
da = ba; // [5] outputs: Derived::operator=(Base const &)
}
的效果是,虛擬運營商=具有比具有相同簽名的任何其他虛擬功能的不同的行爲([0]與[1]),通過調用操作者的基本版本通過時稱爲真正的派生對象([1])或派生參考([3]),而在通過基準引用([2])調用時,它執行常規虛擬函數,或者左值或右值是基準引用,另一個派生參考([4],[5])。
這種奇怪的行爲是否有任何明智的解釋?
有沒有猜測這裏涉及。規則非常嚴格。 – MSalters 2009-06-09 11:14:52