有关c++父子类构造函数的问题

很久没有写代码了,今天借着这次机会自己又回头总结一下,还是发现了不少问题,接下来总结一下。

首先创建父类:

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;
}

以上仅仅是自己的理解,如果有偏差的地方欢迎私信来访~我也会继续努力的!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章