<!-- lang: cpp --> 在此输入代码 #include <iostream> #include <string> using namespace std; class base { public: int f() const{ cout << "base::f()" << endl; return 1; } int f(string) const{ cout << "base::f(string)" <<endl; return 1; } void g(){cout << "base::g()"<<endl;} }; class derived1 : public base { public: void g() const{cout << "derived1::g()" <<endl;} }; class derived2 : public base { public: int f() const{ cout << "derived2::f()" << endl; return 2; } }; class derived3 : public base { public: void f() const{cout << "derived3::f()" <<endl;} }; class derived4 : public base { public: int f(int) const{ cout << "derived4::f()" <<endl; return 4; } }; int main() { string s("hello"); derived1 d1; int x = d1.f(); d1.f(s); d1.g(); deprived2 d2; // d2.f(s) // error base::f(string) 被隐藏 derived3 d3; // int x = d3.f(); // error 说明不能调用基类的int 型的f() d3.f(); derived4 d4; // d4.f(); // error 说明只能调用本身类里面的f(int); d4.f(1); cin.get(); return 0; }
thinking in c++
: In base you see an overloaded function f(), and deprived1 doesnt make any change to f() but it doesredefine
.ios
In main(), you can see that both
overloaded
versions of f() are available in deprived1c++deprived2
redefines
one overloaded version of f() but not the otherideIn deprived3, changing the return type hides both the base class versions函数
The deprived4 shows that changing the arguement list also hides both the base class versions.spa
有virtual的例子code
<!-- lang: cpp --> 在此输入代码 #include <iostream> #include <string> using namespace std; class Base { public: virtual int f() const { cout << "Base::f()\n"; return 1; } virtual void f(string) const {cout << "base::f(string)" << endl;} virtual void g() const {} }; class Derived1 : public Base { public: void g() const {} }; class Derived2 : public Base { public: // Overriding a virtual function: int f() const { cout << "Derived2::f()\n"; return 2; } }; class Derived3 : public Base { public: // Cannot change return type: //! void f() const{ cout << "Derived3::f()\n";} }; class Derived4 : public Base { public: // Change argument list: int f(int) const { cout << "Derived4::f()\n"; return 4; } }; int main() { string s("hello"); Derived1 d1; int x = d1.f(); d1.f(s); Derived2 d2; Base& b2 = d2; x = d2.f(); b2.f(s); //! d2.f(s); // string version hidden Derived4 d4; x = d4.f(1); //! x = d4.f(); // f() version hidden //! d4.f(s); // string version hidden Base& br = d4; // Upcast //! br.f(1); // Derived version unavailable br.f(); // Base version available br.f(s); // Base version abailable cin.get(); return 0; } 运行结果: Base::f() base::f(string) Derived2::f() base::f(string) Derived4::f() Base::f() base::f(string)
(有待完善)ci