很久沒有寫代碼了,今天藉着這次機會自己又回頭總結一下,還是發現了不少問題,接下來總結一下。
首先創建父類:
class Vehicle{
private:
string name;
double M_Speed;
public:
void GetName(){cout<<"Name:"<<name<<endl;}
void SetName(){string n;cin>>n;name=n;}
void GetM_Speed(){cout<<"M_Speed:"<<M_Speed<<endl;}
void SetM_Speed(){double m;cin>>m;M_Speed=m;}
Vehicle(){
this->name="***";
this->M_Speed=0.0;
}
Vehicle(string name,double M_Speed){
this->name=name;
this->M_Speed=M_Speed;
}
};
在父類中,存在兩個構造函數無參構造函數Vehicle() 和 有參構造函數Vehicle(string name,double M_Speed) 那麼如何使用呢?我們在數函數中寫幾組數據進行測試:
Vehicle v1;
Vehicle v2("v2",20);
v1.GetName();
v1.GetM_Speed();
cout<<"\n";
v2.GetName();
v2.GetM_Speed();
可以得到結果爲:
以上測試數據中,v1由於在創建時未指定數據,因此調用了無參構造函數,進行了初始賦值;而v2則是傳輸了相應的值,實現了有參構造函數的調用。
接下來是子類:
class Car:public Vehicle{
private:
public:
Car(){
}
Car(string n,double M):Vehicle(n,M){
}
};
子類相對簡單,沒有私有變量,但是又兩個構造函數,無參 和 有參,因此如何調用無參和有參構造函數成爲討論的重點問題。
首先我們要明確的是,子類對象在創建時,在沒有指定的情況下,首先會調用父類的無參構造函數,然後再調用子類的構造函數即子類中的構造函數其實在執行過程中是以下情形:
Car(){
Vehicle();
}
但是在子類的有參構造函數中,由於Name,M_Speed都是父類中的私有成員,因此子類構造函數想要對其進行初始化就必須調用父類的構造函數
Car(string n,double M):Vehicle(n,M){}
1.爲什麼要在car()中定義n和M,而不是在父類的Vehicle中定義?
首先你操作的對象是子類的,所有的操作應當針對子類進行;你要調用父類的構造函數,既然是調用,就不能夠在Vehicle中再次定義。
2.父類有參構造函數中寫了this->name=name;爲什麼子類的有參構造函數不能再寫this->name=name;等語句?
name是父類的私有成員啊,兒子怎麼能看見他爹不想讓他看見的東西呢?(手動狗頭)如果說,子類中有自己的私有成員,假設是:
那麼你的有參構造中就可以添加如下語句:
Car(string n,double M,double money):Vehicle(n,M){this->money=money;}
因爲money是子類私有的,它的構造函數可以直接對其進行操作。
完整代碼:
.
#include <iostream>
#include <vector>
using namespace std;
class Vehicle{
private:
string name;
double M_Speed;
public:
void GetName(){cout<<"Name:"<<name<<endl;}
void SetName(){string n;cin>>n;name=n;}
void GetM_Speed(){cout<<"M_Speed:"<<M_Speed<<endl;}
void SetM_Speed(){double m;cin>>m;M_Speed=m;}
Vehicle(){
this->name="***";
this->M_Speed=0.0;
}
Vehicle(string name,double M_Speed){
this->name=name;
this->M_Speed=M_Speed;
}
};
class Car:public Vehicle{
private:
double money;
public:
Car(){
}
Car(string n,double M,double money):Vehicle(n,M){
this->money=money;
}
};
int main()
{
Car c1;
c1.GetName();
c1.GetM_Speed();
Car c2("car",220,666);
c2.GetName();
c2.GetM_Speed();
return 0;
}