我們知道在Java中是自動實現多態的,Java中規定重寫的方法的訪問權限不能縮小。那么在C++中我們實現多態的時候是否可以更改(縮小)訪問權限呢?
經過測試,得到的答案如下:如果用基類指針指向派生類對象實現多態則虛函數的訪問權限以基類中的訪問權限為準。因此只要基類中的訪問權限是public
就可以訪問。派生類對象的訪問權限以派生類中的為準。
這就意味這我們只要基類的虛函數權限是public
,我們就可以使用基類指針訪問到派生類私有的虛函數。
具體樣例:
#include<cstdio>
#include<iostream>
#include<string>using namespace std;class Employee
{
protected:string name, ID;Employee(string _name,string _ID):name(_name),ID(_ID){}void SetName(string _name){name = _name;}void SetID(string _ID){ID = _ID;}string GetName(){return name;}string GetID(){return ID;}
public:virtual double DisplaySalary(){return 0;}virtual void DisplayInform() = 0;
};class Manager :public Employee
{double salary;
public:Manager(string _name,string _ID,double _salary=5000):Employee(_name,_ID),salary(_salary){}double DisplaySalary(){return salary;}void DisplayInform(){cout << "經理信息:" << endl;cout << "姓名:" << name << "\tID:" << ID << "\t薪資:" << salary << endl;}void SetSalary(double _salary){salary = _salary;}
};class Technician :public Employee
{double wage, hours;
public:Technician(string _name, string _ID, double _wage = 100,double _hours=288):Employee(_name,_ID),wage(_wage),hours(_hours){}void SetWage(double _wage){wage = _wage;}void SetHours(double _hours){hours = _hours;}double DisplayWage(){return wage;}double DisplayHours(){return hours;}
private:double DisplaySalary(){return wage * hours;}void DisplayInform(){cout << "經理信息:" << endl;cout << "姓名:" << name << "\tID:" << ID << "\t薪資:" << DisplaySalary() << endl;}
};int main()
{Employee* p1 = new Manager("A", "01", 9000);Employee* p2 = new Technician("B", "02");Technician C("C", "03");p1->DisplayInform();p2->DisplayInform();cout << C.Employee::DisplaySalary() << endl;//直接訪問會報錯p2 = &C;cout << p2->DisplaySalary() << endl;return 0;
}
運行結果: