是的。當您需要操作符實現的虛擬函數行爲時使用此技術:您可以使用虛擬(或抽象)函數來定義操作符,並讓專業化來決定如何實現該函數。
例如:
class base
{
// yada yada yada
base& operator=(const base& other) { return assign(other); }
protected:
virtual base& assign(const base& other) = 0; // specializations will decide
// what assignment means
};
編輯:另一個使用了該技術,讓您的類的特例來控制更復雜的操作只有部分:
class database
{
public:
void execute(const std::string& query)
{
begin_transaction(); // in practice, this should be RAII
connection_.execute(query);
end_transaction();
}
protected:
virtual void begin_transaction() = 0;
virtual void end_transaction() = 0;
private:
whatever &connection_;
};
在數據庫中特,一假設mysql_database::begin_transaction
將具有與sqlite_database::begin_transaction
不同的實現。
+1。當然,有時候「嘗試它」會導致諸如「y = x ++ + x ++」這樣的事情 - 它會「有效」,但不會「每次都正確運行」。所以只是因爲某些方法有效,並不意味着它是可以接受的,甚至是對的。 – 2013-03-13 17:37:57