類的私有成員可以繼承嗎_c++私有繼承有什么用?
特邀律師
如果基類定義的純虛函數(shù),那么子類繼承下來的也是純虛函數(shù),如果不給予實現(xiàn),那么便不能創(chuàng)建子類的實例,如果基類定義的是非純虛函數(shù),那么子類繼承下來的也是非純虛函數(shù)。都可以不予實現(xiàn),因為自動繼承下來了,看你子類的需要。
1.派生類間接訪問基類私有成員
在類的繼承中,基類私有成員在派生類中是“不可見“的,這種”不可見“是指在派生類的成員函數(shù)中,或者通過派生類的對象(指針,引用)不能直接訪問它們。但是,不能直接訪問并不代表不能訪問。在派生類還是能夠通過調(diào)用基類的共有函數(shù)的方式來間接地訪問基類的私有成員,包括私有成員變量和私有成員函數(shù)。考察如下程序。
#include <iostream>using namespace std;class A{ int i; void privateFunc() { cout<<"this is a private function of base class"<<endl; }public: A(){i=5;} int getI() { return i; } void usePrivateFunc() { privateFunc(); }};class B:public A{public: void printBaseI() { cout<<getI()<<endl; } void usePrivateFunction() { usePrivateFunc(); }};int main(){ B b; b.printBaseI(); b.usePrivateFunction();}
程序輸出結(jié)果:
5this is a private function of base class
在類B中,由于基類A的成員變量i和成員函數(shù)privateFunc()都是私有的,所以在類B的成員函數(shù)中無法直接訪問到它們。但是,由于類A的公有成員函數(shù)getI()可以訪問到私有成員變量i,而usePrivateFunction()可以訪問私有成員函數(shù)privateFunc(),所以在類B中通過調(diào)用函數(shù)getI()和usePrivateFunc()就可以簡介訪問基類A中的私有成員。
2.私有成員會被繼承嗎
如果基類中并沒有提供訪問私有成員的公有函數(shù),那么其私有成員是否“存在“呢?還會不會被繼承呢?其實,這些私有成員的確是存在的,而且會被繼承,只不過程序員無法通過正常的渠道訪問到它們。考察如下程序,通過一種特殊的方式訪問了類的私有成員。
#include <iostream>using namespace std;class A{ int i; void privateFunc() { cout<<"this is a private function of base class"<<endl; }public: A(){i=5;}};class B:public A{public: void printBaseI() { int* p=reinterpret_cast<int*>(this);//獲取當前對象的首地址 cout<<*p<<endl; } void usePrivateFunction() { void (*func)()=NULL; _asm { mov eax,A::privateFunc; mov func,eax; } func(); }};int main() { B b; b.printBaseI(); b.usePrivateFunction();}
程序輸出結(jié)果:
5this is a private function of base class
(1)雖然類A沒有提供訪問私有成員變量i的公有方法,但是在類A(以及類A的派生類)對象中個,都包含變量i。
(2)雖然類A并沒有提供訪問私有成員函數(shù)privateFunc()的公有函數(shù),但是在程序代碼區(qū)依然存有函數(shù)privateFunc()的代碼,通過內(nèi)聯(lián)匯編獲取該函數(shù)的入口地址,仍然可以順利調(diào)用。
綜上所述,類的私有成員一定存在,也一定被繼承到派生類中,從大小也可以看出派生類包含了基類的私有成員,讀者可自行考證。只不過收到C++語法的限制,在派生類中訪問基類的私有成員只能通過間接的方式進行。
子類繼承父類時,需要注意以下三點:
1、在子類繼承父類的時候,子類必須調(diào)用父類的構(gòu)造函數(shù)。
2、如果父類有默認構(gòu)造函數(shù),子類實例化時自動調(diào)用
私有繼承可以實現(xiàn) has a 的關(guān)系,也就是包含。私有繼承中:1. 父類的 public 和 protected 成員在子類中變成了子類 private 的成員,1.1 這就意味著從父類繼承過來的這些成員(public/protected), 子類的成員函數(shù)可以調(diào)用之;但是子類的對象就不能夠調(diào)用之;進一步的理解就是,在 子類中可以調(diào)用父類的(public/private)接口, 但是這些接口不會被暴露出去。這個特性正好實現(xiàn)了包含(composite)的特性。