2011-12-15 58 views
0

我有一個奇怪的問題,我敢肯定有一個簡單的修復。我有一個超類,我們稱之爲「鳥」。 Bird有一個稱爲chirp的虛函數,它返回0。我也有一個子類讓它調用它... SomeOtherBird。 SomeOtherBird是Bird的一個子類。我的子類的啁啾()函數應該返回我1C++多態性

到目前爲止:

Bird.Chirp()應該返回0 SomeOtherBird.Chirp()應該返回1

一些其他的鳥是鳥的一個子類。

現在,假設我將Bird傳入一個獨立的構造函數,我們稱之爲嵌套。

所以:鳥巢(鳥& X)

如果我通過在SomeOtherBird,我稱之爲啁啾,它調用主超一流的虛函數,而不是子類的,因此,例如:

SomeOtherBird x; Nest(x); 然後如果我做了x.chirp,主要方法被調用,而不是子類中的一個。

如何獲得子類中的函數被調用,而不是虛擬主函數?

感謝

+3

此外,包括您在使用,而不是一些迂迴的描述故障的實際代碼。 – Xeo 2011-12-15 05:19:10

+0

Dynamic Dispatch應該可以工作,並且它應該返回1,除非您正在做其他事情。發佈你的整個代碼 – Anand 2011-12-15 05:20:11

回答

-1

沒有看到你的代碼,這是不可能回答您肯定。但是,這聽起來像你沒有在基類中寫「virtual Bird()」,只能在派生類中寫。這是行不通的。

class Bird { 
virtual int Bird(); 
}; 

class MoreBird : public Bird { 
int Bird(); 
}; 

虛擬關鍵字在派生類並不需要(雖然它是不是好的做法不是把它放在那裏,即使程序員的99.9%,是懶惰,不這樣做。)

1

我爲我工作。

ideone.com/RRfau

你真的應該包括像這樣的問題,一些示例代碼,以便我們可以幫助你。

#include <iostream> 
#include <typeinfo> 

class Bird 
{ 
public: 
    virtual ~Bird() {} 
    virtual int chirp() { return 0; } 
}; 

class SomeOtherBird : public Bird 
{ 
public: 
    virtual int chirp() { return 1; } 
}; 

void nest(Bird& x) 
{ 
    std::cout << typeid(x).name() << " says " << x.chirp() << '\n'; 
} 

int main() 
{ 
    SomeOtherBird s; 
    nest(s); 

    Bird b; 
    nest(b); 
} 
1

工作正常,如下所示。也許你可能沒有使基本方法變爲虛擬。或者代碼中還有其他錯誤,因爲代碼沒有發佈,所以不可能說明。

#include <iostream> 
using namespace std; 

class Bird 
{ 
public: 
    Bird() {} 
    ~Bird() {} 
    virtual int Chrip() { cout << "Bird version" << endl; return 0; } 
}; 

class SomeOtherBird:public Bird 
{ 
public: 
    SomeOtherBird() {} 
    ~SomeOtherBird() {} 
    virtual int Chrip() { cout << "SomeOtherBird version" << endl; return 1; } 
}; 

int nest(Bird &b) 
{ 
    b.Chrip(); 
} 

int main() 
{ 
    SomeOtherBird s; 
    Bird &b = s; 
    int retcode = nest(b); 
    cout << "retcode " << retcode << endl; 
} 

輸出:

rhdevblade1-~/cpp: ./virt 
SomeOtherBird version 
retcode 1