Если сигнатура дочерней функции отличается от сигнатуры, то у потомка есть две функции, которые перегружены .
Компилятор выберет правильную в соответствии сна какие аргументы вы даете это.Можно изменить его аргументы и переслать работу в другую функцию, если ей это нравится.
Например,
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