在C++中,派生類在定義構造函數時,會調用基類構造函數首先完成基類部分的構造:
class Derive : public Base
{
public:
Derive(string nam, int ad, int elem):Base(elem) {
// 等價: this->name = nam;
// this->add = ad;
name = nam;
add = ad;
}
...
}
若若派生類定義了一個基類已有的數據成員,則會覆蓋掉基類。在這個構造過程中,之類自身的成員構造可以使用this指針,
this->name = name;
也可以直接使用派生類自己已經定義的變量名進行賦值操作,如:
name = name1;
派生類只能直接訪問基類中public/protected的成員,使用【基類類名::member】的形式:
class Derive: public Base{
int new_id = Base::id;// id 在Base中public或protected
string new_name= Base::getName(); //getName是Base的非private成員函數
...........
};
最后,一起看下完整代碼:
#include <iostream>
using namespace std;
struct Base
{
public:
Base(int a) {
this->elem = a; // 等價: elem = a;
}
int getElem() {
return elem;
}
private:
int elem;
};
class Derive : public Base
{
public:
Derive(string nam, int ad, int elem):Base(elem) {
// 等價: this->name = nam;
// this->add = ad;
name = nam;
add = ad;
}
int getElem() {
return add + Base::getElem();
}
string getName() {
return name;
}
int getBaseElem(){
return Base::getElem();
}
private:
string name;
int add;
};
int main()
{
Derive d("child class object", 12, 15);
cout <<"Derive name="<< d.getName() << "\nDerive elem=" << d.getElem();
cout<<endl;
cout<<"Base elem="<<d.getBaseElem();
return 0;
}
下面是運行結果:
$g++ -std=c++11 -o main *.cpp
$main
Derive name=child class object
Derive elem=27
Base elem=15
---------------------