這是CSDN上一個我覺得對C++初學者瞭解虛函數一處很好的題目。
#include <iostream>
using namespace std;
class CA
{
public:
void f(){cout << "CA f()" << endl;}
virtual void ff(){cout << "CA ff()" << endl;f();}
};
class CB : public CA
{
public :
virtual void f(){cout << "CB f()" << endl;}
void ff(){cout << "CB ff()" << endl;f();CA::ff();}
};
class CC : public CB
{
public:
virtual void f(){cout << "C f()" << endl;}
};
int main()
{
CB b;
CA *ap = &b;
CC c;
CB &br = c;
CB *bp = &c;
ap->f();
cout<<endl;
b.f();
cout<<endl;
br.f();
cout<<endl;
bp->f();
cout<<endl;
ap->ff();
cout<<endl;
bp->ff();
cout<<endl;
return 0;
}
運行結果:
CA f()
CB f()
C f()
C f()
CB ff()
CB f()
CA ff()
CA f()
CB ff()
C f()
CA ff()
CA f()
分析:
兩條原則:
(1)指標和引用均能實現多態。
(2)輸出什麼關鍵看“=”右邊是否為虛函數。
如果CA類中的f()也為虛函數,即程式如下:
include <iostream>using namespace std;class CA{public: virtual void f(){cout << "CA f()" << endl;} virtual void ff(){cout << "CA ff()" << endl;f();}};class CB : public CA{public : virtual void f(){cout << "CB f()" << endl;} void ff(){cout << "CB ff()" << endl;f();CA::ff();}};class CC : public CB{public: virtual void f(){cout << "C f()" << endl;}};int main(){ CB b; CA *ap = &b; CC c; CB &br = c; CB *bp = &c; ap->f(); cout<<endl; b.f(); cout<<endl; br.f(); cout<<endl; bp->f(); cout<<endl; ap->ff(); cout<<endl; bp->ff(); cout<<endl; return 0;}
運行結果:
CB f()
CB f()
C f()
C f()
CB ff()
CB f()
CA ff()
CB f()
CB ff()
C f()
CA ff()
C f()
在C++中實現動態多態性需要三個條件:
(1)對象是從同一個類階層中的不同的類產生的;
(2)調用的函數是虛函數;
(3)通過基類指標或引用來調用虛函數。
原帖:http://topic.csdn.net/u/20120330/22/ca8bb6bf-0f2d-46a8-bdbd-e875c5349194.html?seed=1025928861&r=78097348#r_78097348