C++(纯)虚函数重写时访问权限更改问题
生活随笔
收集整理的這篇文章主要介紹了
C++(纯)虚函数重写时访问权限更改问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們知道在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; }運行結果:
總結
以上是生活随笔為你收集整理的C++(纯)虚函数重写时访问权限更改问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++派生类对象和基类对象赋值
- 下一篇: 成都大熊猫繁育基地如何到达