我有一段cpp的聲明,其中一個功能是這樣的:virtual void funcFoo()const = 0和virtual void funcFoo()= 0之間的區別;
virtual void funcFoo() const = 0;
我認爲可以從其他的類繼承,如果宣佈明確的,但什麼是之間
virtual void funcFoo() = 0;
是很重要的區別對我來說,改進我的編程,我想知道其中的差異。我不想因不良繼承造成故障。
在此先感謝。
我有一段cpp的聲明,其中一個功能是這樣的:virtual void funcFoo()const = 0和virtual void funcFoo()= 0之間的區別;
virtual void funcFoo() const = 0;
我認爲可以從其他的類繼承,如果宣佈明確的,但什麼是之間
virtual void funcFoo() = 0;
是很重要的區別對我來說,改進我的編程,我想知道其中的差異。我不想因不良繼承造成故障。
在此先感謝。
第一個簽名表示該方法可以在派生類型的常量實例上調用。第二個版本不能在const實例上調用。它們是不同的簽名,因此通過執行第二個簽名,您不會執行或覆蓋第一個版本。
struct Base {
virtual void foo() const = 0;
};
struct Derived : Base {
void foo() { ... } // does NOT implement the base class' foo() method.
};
+1提到他們不互相重疊。 – 2012-04-02 10:04:55
不,反之亦然:第一個函數可以在常量和非常量實例上調用,而第二個函數只在非常量實例上調用(我知道它很複雜,我第一次弄錯了:-) – 2012-04-02 10:09:07
很好的解釋! – BajaBob 2015-04-09 14:12:52
不同之處在於第一個函數可以在const
對象上調用,而第二個函數不能。而且,第一個函數只能在同一對象上調用其他const
成員函數。關於繼承,他們的行爲方式是一樣的。
另請參閱關於此主題的C++ FAQ。
這兩個虛擬函數有不同的簽名,但繼承將以同樣的方式工作。前者是一個const方法,只能支持const操作(方法)和對象。
const的方法不能改變對象的狀態,這樣的
virtual void funcFoo() const = 0;
將與
virtual void funcFoo() = 0;
的差異可稱爲這個類的常量實例調用只在非常量情況下。 嘗試谷歌的常量邏輯在c + +。 http://en.wikipedia.org/wiki/Const-correctness
virtual void funcFoo() const = 0;
- You can't change the state of the object
- You can call this function via const objects
- You can only call another const member functions on this object
virtual void funcFoo() = 0;
- You can change the state of the object
- You can't call this function via const objects
我已經看到了關於常量correctectness最好的教程或FAQ是由parashift的C++ FAQ:
請看:http://www.parashift.com/c++-faq-lite/const-correctness.html
這是最好的答案。我弄糟的唯一事情就是理解什麼是const對象。 – 2016-04-18 08:48:10
http://stackoverflow.com/questions/ 751681/const-last-in-ac-method-declaration – vid 2012-04-02 10:04:45
簡短回答:'const'正確性。 – iammilind 2012-04-02 10:17:34