2017-04-11 27 views
0

在C++中的分層結構中的類重寫在C++中的類

class n1 
{ 
public: 
    virtual void tt() { cout << "n1" << endl; } 
}; 
class n2:public n1 
{ 
public: 
    void tt() { cout << "n2" << endl; } 
}; 
class n3:public n2 
{ 
    void tt() { cout << "n3" << endl; } 
}; 
int main() 
{ 
    n1 *k = new n3; 
    k->tt(); 
} 

此層次結構在第三類是TT重寫N1虛擬功能或者它被簡單地隱藏N2執行?

在C#中我得到,你可以在層次結構中的任何級別覆蓋最低級別的虛擬方法..但我不知道它是否在C++中是相同的。

Class a 
{ 
    virtual void func(); 
}; 
class b : a 
{ 
    override func() 
}; 
class c : b 
{ 
    override func() 
}; 

回答

4

你重寫它。

如果您不確定您的覆蓋是否正確,我們有一個名爲override(需要C++ 11)的關鍵字,它確保您的覆蓋符合虛擬函數/方法聲明。

這應該澄清一些事情:

#include <iostream> 
using namespace std; 

class n1 
{ 
public: 
    virtual void tt() { cout << "n1" << endl; } 
}; 

class n2:public n1 
{ 
public: 
    void tt() override { cout << "n2" << endl; } 
}; 

class n3:public n2 
{ 
    void tt() override { cout << "n3" << endl; } 
}; 

int main() 
{ 
    n1 *a = new n1; 
    n1 *b = new n2; 
    n1 *c = new n3; 

    a->tt(); 
    b->tt(); 
    c->tt(); 

    delete a; 
    delete b; 
    delete c; 
} 

輸出:
N1
N2
N3

Live

所以在3類層次A-> B- > C如果A具有虛擬方法並且B實現它,它並不意味着派生類從B將採取的方法已經

如果你重寫它,那麼將使用該覆蓋。

If you don't override the method, then the last overriden method will be used.

class n1 
{ 
public: 
    virtual void tt() { cout << "n1" << endl; } 
}; 

class n2:public n1 
{ 
public: 
    void tt() override { cout << "n2" << endl; } 
}; 

class n3:public n2 
{ 

}; 

輸出:
N1
N2
N2

+0

因此,在一個3類層次A-> B-> C如果A具有虛擬方法和B實現它,它並不意味着從B派生的類將採用已經實現的方法。 –

+0

@ adrian.bercovici更新。 – deW1

+0

@ adrian.bercovici如果使用虛擬調度(或靜態調度到B)調用方法,則將調用B的版本*。當使用靜態調度時,即使在'B'的實例([示例](http://coliru.stacked-crooked.com/a/068cbcb577e090d0))上仍然可以調用A'的版本。這與C#不同,在C#中,繼承和重寫的方法實際上變得對覆蓋它的類進行私有化。 – cdhowie