我認爲如果foo
在類D
中聲明,但沒有標記爲虛擬,則以下代碼將調用D
中的foo
的實現(與d
的動態類型無關)。在C++中,如果覆蓋虛擬函數,它是一個自動虛擬的函數嗎?
D& d = ...;
d.foo();
但是,在下面的程序中,情況並非如此。任何人都可以解釋嗎?如果一個方法覆蓋了一個虛擬函數,該方法是否會自動虛擬化?
#include <iostream>
using namespace std;
class C {
public:
virtual void foo() { cout << "C" << endl; }
};
class D : public C {
public:
void foo() { cout << "D" << endl; }
};
class E : public D {
public:
void foo() { cout << "E" << endl; }
};
int main(int argc, char **argv)
{
E& e = *new E;
D& d = *static_cast<D*>(&e);
d.foo();
return 0;
}
上述程序的輸出是:
E
的的static_cast是多餘 - 'd&d = *的static_cast(&e);'相當於'd&d = E;'由於從E */E&到d *的隱式轉換/ D&。 –
在函數聲明中加入「override」使得它清除你的意圖來覆蓋基類函數,它也會觸發編譯器的錯誤,以防你聲明的函數在const和base之間不同如果你從std :: exception中派生出來並且聲明瞭what()非const) – Ghita