virtual,基類同名函數全部被隱藏(非多載)。
class Base { public: void f(int); };
class Derived : public Base { public: void f(char*); };
Derived* pd = new Derived;
pd->f(10); // Error: Base::f(int) 被 Derived::f(char*) 隱藏,10 無法轉 char*
class Derived : public Base {
public:
void f(char*);
using Base::f; // 將 Base::f(int) 引入 Derived 作用域
};
// 現在 pd->f(10) 正常呼叫 Base::f(int)
using Base::f; 會引入基類所有名為 f 的多載,衍生類同名多載參與多載解析。
class Base {
public:
virtual void f(float) { cout << "Base::f(float)"; }
void g(float) { cout << "Base::g(float)"; }
void h(float) { cout << "Base::h(float)"; }
};
class Derived : public Base {
public:
virtual void f(float) { cout << "Derived::f(float)"; } // 覆蓋
void g(int) { cout << "Derived::g(int)"; }
void h(float) { cout << "Derived::h(float)"; }
using Base::g; // 解除 g 隱藏,恢復 Base::g(float) 可用
using Base::h; // 解除 h 隱藏
};
using Base::FuncName;,除非確定要隱藏。override(C++11)編譯期檢查簽章。