我有一个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有问题的功能没有周边类。这些应该如何“虚拟”呢? –