class Base
{
public:
virtual void f(int)
{
printf("Base f(int)\n");
}
virtual void f(int, int)
{
printf("Base f(int, int)\n");
}
};
class Der : public Base
{
public:
using Base::f;
virtual void f(double)
{
printf("Der f(double)\n");
}
};
所以在这种情况下我可以使用基类中的两个函数。但是,是否可以允许在派生类中使用某些特定的重载方法?例如,允许仅使用f(int),但不使用f(int,int)。
答案 0 :(得分:4)
无法有选择地取消使用using
指令的基类方法。不幸的是,这是全有或全无。
答案 1 :(得分:3)
这样做:
class Der : public Base {
...
virtual void f(int p) { return Base::f(p); }
如果您关注性能,则会导致静态调度到void Base::f(int)
。
答案 2 :(得分:0)
实际上,通过取消隐藏所有成员然后再隐藏特定成员(例如通过提供私有覆盖),可以仅隐藏基类中的某些成员:
struct Base
{
void f(int) {
printf("Base f(int)\n");
}
void f(int, int) {
printf("Base f(int, int)\n");
}
};
struct Der : Base
{
using Base::f; // unhide all f's from Base
void f(double) {
printf("Der f(double)\n");
}
// hide f(int, int) from Base by declaring it as private (no implementation needed)
private:
void f(int, int);
};
void Example() {
Der der;
der.f(1); // OK Base::f(int)
der.f(1.0f); // OK Der::f(double)
der.f(1,1); // compiler error: 'f' is a private member of 'Der'
}