複製鏈接
請複製以下鏈接發送給好友

私有繼承

鎖定
私有繼承後,基類所有成員在派生類中為private成員。
中文名
私有繼承
外文名
private
領    域
C++編程語言
派生類
私有派生類
基    類
私有基類

私有繼承具體介紹

私有基類的公用成員和保護成員在私有派生類中的訪問屬性相當於派生類中的私有成員,即派生類的成員函數能訪問它們,而在派生類外不能訪問它們。私有基類的私有成員在派生類中稱為不可訪問的成員,只有基類的成員函數可以引用它們,一個基類成員在基類中的訪問屬性和在私有派生類中的訪問屬性可能是不相同的。私有基類的成員在私有派生類中的訪問屬性見下表:
私有基類中的成員
在私有派生類中的訪問屬性
私有成員
公用成員
保護成員
不可訪問
私有
私有
例:
class Student1: private Student
{public:
void display_1()
{ cout<<"age:"<<age<<endl;
cout<<"address:"<<addr<<endl;
private:
int age;
string addr;
};

私有繼承私有繼承作用

看似沒有任何意義,但私有繼承可以幫助我們複用基類代碼,並防止基類接口的曝光。
看下面一個例子:
#include <iostream>
using std::cout;
using std::endl;
class engine {
public :
void start() {cout << "engine->start" << endl;}
void move() {cout << "engine->move" << endl;}
void stop() {cout << "engine->stop" << endl;}
};
class wheel {
public :
void start() {cout << "wheel->start" << endl;}
void move() {cout << "wheel->move" << endl;}
void stop() {cout << "wheel->stop" << endl;}
};
class car : private engine, private wheel {
public :
void start();
void move();
void stop();
};
void car::start() {
engine::start();
wheel::start();
}
void car::move() {
engine::move();
wheel::move();
}
void car::stop() {
engine::stop();
wheel::stop();
}
int main(int argc, char* argv[]) {
car ca;
ca.start();
ca.move();
ca.stop();
return 0;
}
例子中類car私有繼承自類engine和類wheel,類car的三個成員函數start()、move()、stop()分別通過調用類engine和類wheel的成員函數實現,這樣做的好處在於不需要重寫而直接使用繼承自基類的函數,同時因為是私有繼承,能通過類car的對象不能直接調用類engine和類wheel的函數,防止不必要函數的曝光,因為對於使用類car對象的用户來説並不需要關心start()、move()、stop()的具體實現過程,也不需要控制engine和wheel的動作。