2015-11-09 16 views
1

我有一個Base類和DerivedBase多態性和函數重載?

struct Base{}; 
struct Derived: public Base{}; 

我想要接受Base*功能,但通過了Derived*時具有不同的功能。

void myFunc(Base* base){ 
std::cout << "myFunc(base)" << std::endl; 
} 

void myFunc(Derived* derived){ 
std::cout << "myFunc(derived)" << std::endl; 
} 

我的問題是,當我嘗試使用多態,根據需要,因爲我總是傳遞Base*的功能不行爲。

Base* base = new Base(); 
Base* derived = new Derived(); 

myFunc(base); 
myFunc(derived); 

輸出:

myFunc(base) 
myFunc(base) 

希望的輸出:

myFunc(base) 
myFunc(derived) 

我不能使用鑄造等的原因 - (Derived*)derived - 是因爲我使用的Base*

陣列
#include <iostream> 

struct Base{};  
struct Derived: public Base{}; 

void myFunc(Base* base){ 
std::cout << "myFunc(base)" << std::endl; 
} 

void myFunc(Derived* derived){ 
std::cout << "myFunc(derived)" << std::endl; 
} 

void myFunc(Base** bases, size_t count){ 
for(auto i = 0; i < count; i++){ 
    myFunc(bases[i]); 
} 
} 

int main(){ 
Base* bases[2]; 
bases[0] = new Base(); 
bases[1] = new Derived(); 

myFunc(bases, 2); 
} 

我不能讓myFunc成爲虛擬成員函數的原因是因爲我想將myFunc的功能封裝在單獨的類中以避免單一的基類。

#include <iostream> 

struct Base{}; 

struct Derived: public Base{}; 

struct DoesStuff{ 
void doStuff(Base* base){ 
    std::cout << "doStuff(base)" << std::endl; 
} 

void doStuff(Derived* derived){ 
    std::cout << "doStuff(derived)" << std::endl; 
} 

void doStuff(Base** bases, size_t count){ 
    for(auto i = 0; i < count; i++){ 
    doStuff(bases[i]); 
    } 
} 
}; 

struct DoesOtherStuff{ 
void doOtherStuff(Base* base){ 
    std::cout << "doOtherStuff(base)" << std::endl; 
} 

void doOtherStuff(Derived* derived){ 
    std::cout << "doOtherStuff(derived)" << std::endl; 
} 

void doOtherStuff(Base** bases, size_t count){ 
    for(auto i = 0; i < count; i++){ 
    doOtherStuff(bases[i]); 
    } 
} 
}; 

int main(){ 
Base* bases[2]; 
bases[0] = new Base(); 
bases[1] = new Derived(); 

DoesStuff stuffDoer; 
DoesOtherStuff otherStuffDoer; 

stuffDoer.doStuff(bases, 2); 
otherStuffDoer.doOtherStuff(bases, 2); 
} 

如何獲得myFunc知道Base*是偷偷Derived*。我想我可以使用typeid,但我不確定這是最合適的解決方案。如我錯了請糾正我。

+2

你必須聲明你的函數是虛擬的。請記住,最好通過引用而不是指針 – KostasRim

+0

嘗試使用模板並提供適當的特化,而不是通過'Base *'和'Derived *'指針類型引入歧義。 –

+1

@ KostasRim有問題的功能沒有周邊類。這些應該如何「虛擬」呢? –

回答

1

爲了得到這個通過多態性的工作是做到以下幾點:

  1. 創建的基類,你想要做的基類做一個虛擬成員功能。

  2. 重寫Derived類中的該成員函數,並讓它爲Derived類執行所需操作。

這就是多態性的本質。它不適用於非成員函數或免費函數的原因是因爲它們都傳遞了基類指針。

+0

讓我們來添加它只是_runtime_的本質(又名_dynamic_)多態性。重載或模板路由也是多態的,但不是經典的OOP多態(我認爲經典的OOP風格在C++中應該是罕見的,因爲通常其他語言更適合這種...) – sehe

+0

這很公平。但我不同意括號內的陳述的最後部分。 –

+0

如果'myFunc'是一個類的一部分,我有責任爲'Base'和'Derived'做些什麼。 現在我正在避免一個在'Base'裏面有幾十個不相關的函數的問題,而不是在'Base'的數組上運行的類# –