環境:VS2010
代碼:
//public:
#include <iostream>
using namespace std;
class A{
public:
virtual ~A() {}
virtual void func() {
printf("A::func()\n");
};
};
class B: public A{
private:
virtual void func(){
printf("B::func()\n");
};
};
int main(void){
A *p = new B;
p->func();
delete p;
}
//private:
#include <iostream>
using namespace std;
class A{
public:
virtual ~A() {}
virtual void func() {
printf("A::func()\n");
};
};
class B: private A{
public:
virtual void func(){
printf("B::func()\n");
};
};
int main(void){
A *p = (A*)new B;
p->func();
delete p;
}
觀察以上兩個程序的輸出結果。
1.共有繼承,派生類虛函數為private輸出結果:
2.私有繼承,派生類虛函數為public輸出結果:
發現輸出結果一致。
總結:多態與成員函數的訪問權限是沒有關系的, 即兩回事. 基類定義了虛函數, 並且是public的.那麼子類只要override虛函數 無論放在什麼樣的訪問權限(private,protect,public), 都以基類的訪問權限為准, 即是public的.
作者 Wentasy