最近我遇到了一個令人沮喪的問題,它歸結爲一個非常簡單的編碼錯誤。請看下面的代碼:缺少虛擬關鍵字的警告
#include <iostream>
class Base
{
public:
void func() { std::cout << "BASE" << std::endl; }
};
class Derived : public Base
{
public:
virtual void func() { std::cout << "DERIVED" << std::endl; }
};
int main(int argc, char* argv[])
{
Base* obj = new Derived;
obj->func();
delete obj;
return 0;
}
輸出是
BASE
顯然,(這種情況),我的意思是,把虛擬關鍵字在基地:: FUNC使派生:: func將在main中調用。我意識到這可能是(可能)由C++標準允許的,可能有很好的理由,但在我看來,99%的時間這將是一個編碼錯誤。但是,當我使用g ++和我能想到的所有-Wblah選項進行編譯時,不會生成任何警告。
當派生類和派生類都具有相同名稱的成員函數,而派生類的函數是虛擬的,而基類的函數不是虛函數時,是否有方法生成警告?
'delete'的例子不能因爲'Base'沒有一個'virtual'析構函數 – 2012-09-28 20:02:50