#include <iostream> using namespace std; class Base { public: void f(int x) { cout << "Base::f(int) " << x << endl; } void f(float x) { cout << "Base::f(float) " << x << endl; } void h(int x) { cout << "Base::h(int) " << x << endl; } virtual void g() { cout << "Base::g() " << endl; } }; class Derived : public Base { public: void f(int x) { cout << "Derived::f(int) " << x << endl; } void f(float x) { cout << "Derived::f(float) " << x << endl; } void h(char * ) { cout << "Derived::h(char *) " << endl; } // void h(int x) { Base::h(x); } virtual void g() { cout << "Derived::g() " << endl; } // virtual可有可无,但要保证基类中有, 才是多态. }; int main() { int i = 1; float f = 2.0; Base b, *pb; Derived d, *pd; b.f(i); b.f(f); b.g(); d.f(i); d.f(f); d.g(); d.h(i); // 就近原则(也称隐藏) /* pd = &b; // 不能强制使派送类指针指向基类 pd->f(i); pd->f(f); pd->g(); */ pb = &d; pb->f(i); pb->f(f); // 普通成员函数是根据指针的类型 pb->g(); // 保持派生类覆盖函数, 是根据原始的对象类型. Base &b2 = d; b2.f(i); b2.f(f); // 普通成员函数是根据指针的类型 b2.g(); // 保持派生类覆盖函数, 是根据原始的对象类型. /* Derived &d2 = b; // 不能由基类引用到派生类 d2.f(i); d2.f(f); d2.g(); */ return 0; }