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

吉科

多态对象的函数重载在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);
}
pmfcollings

就像其他答案所说的那样,函数调用将是:

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

在计算要调用的函数时,编译器将倾向于在从派生类型转换为基类型之前匹配精确类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章