在水木上見到一個貼子,關于虛函數的訪問權限問題:
#include<cstdlib>

#include<iostream>

using?namespace?std;

?


class?B?
{

public:


???virtual?int?f1()
{cout<<"B::f1()"<<endl;return?0;}


???virtual?void?f2(?int?val)
{cout<<"B::f2(int)"<<endl;}


???virtual?int?f3(?int?val?)
{cout<<"B::f3(int)"<<endl;return?0;}

};

?


class?D?:?public?B?
{


???int?f1()
{cout<<"D::f1()"<<endl;return?0;}


???virtual?void?f4()
{cout<<"D::f4()"<<endl;}


???int?f3(int?val)
{cout<<"D::f3(int)"<<endl;return?0;}

};

?

int?main(int?argc,?char?*argv[])



{

???B?*bp?=?new?D;

???bp->f3(12);//D中的f3是private的,可以訪問#1

???D?*dp=new?D;

???dp->f3(12);//f3是private,訪問不了,編譯通不過

???system("PAUSE");

???return?EXIT_SUCCESS;

}

其實這是一個關于訪問權限決定時間的問題,由于訪問權限是編譯時間決定的,而不是運行時決定的。
B *bp = new D;??// 此時bp所指向的類型是B而不是D,而B的f3()是公有的,所以可以訪問。
D *dp = new D; // 此時dp所指向的類型是D,而D的f3()是私有的,所以不能訪問。






































































其實這是一個關于訪問權限決定時間的問題,由于訪問權限是編譯時間決定的,而不是運行時決定的。
B *bp = new D;??// 此時bp所指向的類型是B而不是D,而B的f3()是公有的,所以可以訪問。
D *dp = new D; // 此時dp所指向的類型是D,而D的f3()是私有的,所以不能訪問。