我有一個Base
類和Derived
類Base
多態性和函數重載?
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
,但我不確定這是最合適的解決方案。如我錯了請糾正我。
你必須聲明你的函數是虛擬的。請記住,最好通過引用而不是指針 – KostasRim
嘗試使用模板並提供適當的特化,而不是通過'Base *'和'Derived *'指針類型引入歧義。 –
@ KostasRim有問題的功能沒有周邊類。這些應該如何「虛擬」呢? –