2009-06-23 81 views

回答

5

它不是必須的。如果某個方法在基類中聲明爲虛擬,則在派生類中重寫該方法時,重寫函數也會變爲虛擬,即使未使用關鍵字virtual也是如此。

+0

謝謝,我不知道。 – user224579 2009-06-23 06:54:42

2

是嗎?下面的代碼產生期望的輸出B :: f1()(使用VS2008編譯):

class A 
{ 
public: 

    virtual ~A(){} 
     virtual void f1() 
     { 
     std::cout<<"A::f1()\n"; 
     } 

     virtual void f2() 
     { 
     std::cout<<"A::f2()\n"; 
     } 
}; 

class B : public A 
{ 
public: 
     void f1() 
     { 
     std::cout<<"B::f1()\n"; 
     } 

     void f2() 
     { 
     std::cout<<"B::f2()\n"; 
     } 
}; 


int main() 
{ 
    B b; 
    A* p = &b; 
    p->f1(); 

    return 0; 
} 
+0

謝謝你的回答,幫了很大忙。 – user224579 2009-06-23 06:56:39

3

它沒有。

class Base 
{ 
    virtual void foo() {} 
}; 

class Derived : public Base 
{ 
    void foo() {} 
} 
在此代碼 foo()

依然是虛擬的在Derived類,即使它沒有被聲明爲這樣。

2

引述C++標準(10.3.2):

如果虛擬成員函數vf在類Base和在類Derived被聲明,直接或間接從Base衍生,成員函數vf具有與Base::vf相同的名稱和相同的參數列表,則Derived::vf也是虛擬的(不論它是否如此聲明),並且其優先於Base::vf

你可以總結一下:「一次虛擬,總是虛擬」。但是,仍然可以將virtual修飾符添加到重寫成員函數中,以便向用戶明確該類是多態的。

0

一個不需要。 但我更喜歡在派生類中使用虛函數,因爲它會使讀取代碼時與這些函數關聯的動態綁定更加清晰。