c ++中的动态多态和函数重载

时间:2015-08-19 10:38:55

标签: c++ polymorphism

使用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);
}

3 个答案:

答案 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类的成员。