使用polymorph对象进行函数重载是否适用于C ++。我希望获得类似下面代码的行为。
编辑:
我希望setInput为每个派生类提供不同的功能。
task.setInput(derived2)
调用setInput(BaseClass* object)
,为我销毁它。允许小姐使用api。所以我认为我必须在方法中切换功能。我想使用dynamic_cast
会这样做吗?多谢。 :-)
class BaseClass { virtual void xy() .. }
class Derived1Class : BaseClass { .. }
class Derived2Class : BaseClass { .. }
class Derived3Class : Derived2Class { .. }
class Task {
void setInput(BaseClass* object);
void setInput(Derived1Class* object);
void setInput(Derived2Class* object);
void setInput(Derived3Class* object);
}
main() {
BaseClass* base = new BaseClass();
Derived1Class* derived1 = new Derived1Class();
BaseClass* derived2 = new Derived2Class();
Derived2Class* derived3 = new Derived3Class();
Task* task = new Task();
task.setInput(base);
task.setInput(derived1);
task.setInput(derived2);
task.setInput(derived3);
}
答案 0 :(得分:5)
函数重载是在编译时根据参数的静态类型完成的,而不是在动态运行时类型上完成的。如下所示:
BaseClass* derived2 = new Derived2Class();
task.setInput(derived2);
会调用setInput
重载,而BaseClass*
不是 Derived2Class*
。
所以答案取决于你期望的行为,但我猜测的答案是没有。
答案 1 :(得分:3)
正如其他答案所说,函数调用将是:
void setInput(BaseClass* object); // F0
void setInput(Derived1Class* object); // F1
void setInput(Derived2Class* object); // F2
void setInput(Derived3Class* object); // F3
task.setInput(base); // calls F0
task.setInput(derived1); // calls F1
task.setInput(derived2); // calls F0
task.setInput(derived3); // calls F2
因此调用的函数取决于指针的类型而不是它指向的对象的类型(函数参数没有覆盖多态)。
有多态可用,我们在这个例子中看不到,因为每个指针类型都有setInput()的定义。 这是函数重载,它将允许派生指针匹配 用基指针例如 如果唯一定义的函数是
void setInput(BaseClass * object); // F0
然后所有以下调用仍然会编译并调用FO:
task.setInput(base); // would call F0
task.setInput(derived1); // would call F0
task.setInput(derived2); // would call F0
task.setInput(derived3); // would call F0
编译器支持在转换之前匹配精确类型 在确定要调用哪个函数时,将其转换为基类型。
答案 2 :(得分:1)
基本上你要问的是函数参数是否服从多态。确实如此。派生类指针可以隐式转换为基类指针。所以有一个setInput就足够了。
class Task {
void setInput(BaseClass* object);
}
如果您希望基于特定的派生类具有不同的功能,则可以使用重载函数setInput来接受派生类指针。在这种情况下,调用setInput函数时,将使用与参数的静态类型最匹配的变体。
但是如果你需要以这种方式重载setInput,那么我首先尝试使setInput成为Base类/ Derived类的成员。