如果我有这样的父类:
class Parent {
protected:
virtual void foo(type1 var1, type2 var2);
}
和一个儿童班:
class Child : public Parent {
foo(type1 var1, type2 var2);
}
但如果foo
中的Child
功能不需要var1
和var2
怎么办?有没有办法告诉编译器不要不为这些变量提供内存,因为它们没有被使用?或者,你怎么超载它?结合重载和多态虽然..你怎么做(如果你可以/会!)。
谢谢。
答案 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。编译器将根据您输入的参数执行正确的函数。