C ++中的多态性:我是否必须为子类函数提供与父类相同的参数 - 如何重载

时间:2011-07-04 12:15:12

标签: c++ polymorphism overloading

如果我有这样的父类:

class Parent {
protected:
   virtual void foo(type1 var1, type2 var2);
}

和一个儿童班:

class Child : public Parent {
   foo(type1 var1, type2 var2);
}

但如果foo中的Child功能不需要var1var2怎么办?有没有办法告诉编译器不要不为这些变量提供内存,因为它们没有被使用?或者,你怎么超载它?结合重载和多态虽然..你怎么做(如果你可以/会!)。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果孩子的功能签名与partent的不同,那么孩子的两个功能重载

编译器将根据您提供的参数选择正确的参数。如果愿意,可以修改其参数并将工作转发给另一个函数。

例如,

class Child : public Parent {
   using Parent :: foo;
   void foo (type1 var1);
};

Child c;
child .foo (type1()); // Valid
child .foo (type1(), type2()); // Valid, calls Parent::foo

void Child :: foo (type1 x) {
    Parent :: foo (x+1, blah);
}

或者,如果你想消除歧义。

class Child : public Parent {
   void foo (type1 var1, type2 var2);
};

Child c;
child .foo (type1(), type2()); // Valid, calls Child::foo
child .Parent :: foo (type1(), type2()); // Valid.

覆盖是另一回事。

class Parent {
    virtual void foo () {}
};

class Child1 : parent {
    void foo ();
};

class Child2 : parent {
    void foo ();
};

void call_foo (Parent & p) {p .foo ();}

Parent p;
Child1 c1;
Child2 c2;
call_foo (p); // Calls Parent::foo
foo (c1);     // Calls Child1::foo
foo (c2);     // Calls Child1::foo

答案 1 :(得分:1)

您只需在Child类中定义另一个具有不同签名(即不同参数)的foo函数。这是重载函数foo。编译器将根据您输入的参数执行正确的函数。