为什么遗传值打印出两次?

时间:2016-04-07 00:28:29

标签: c++ inheritance

我正在练习继承,我有一个名为Person的基类。 Person有一个名为age的变量,在Person类构造函数中,我将age设置为5并将年龄打印到屏幕上。我有另一个名为ballPerson的类,它从age继承Person并将age设置为6。当我为Person班级和ballPerson班级创建对象时,会打印出值5age类中Person的值)两次。为什么?

person.h

class Person
{
public:
    Person();
    int age;
    ~Person();
};

Person.cpp

Person::Person() : age(5)
{
    std::cout << age;
}

ballPerson.h

class ballPerson : public Person
{
public:
    ballPerson();
    ~ballPerson();
};

ballPerson.cpp

ballPerson::ballPerson()
{
    age = 6;
    std::cout << age;
}

的main.cpp

int main()
{
    Person p;
    ballPerson bp;


    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:2)

这会打印(.*)}.*

5

这会打印Person p;

56

因为从ballPerson bp; 构造函数调用了Person(基类)构造函数。

答案 1 :(得分:0)

正如Anton所说,子类在实例化对象时会调用其父构造函数。但是,为什么呢?

嗯,按照定义(http://en.cppreference.com/w/cpp/language/derived_class)完成,如果我们看看记忆,我们可以自己看。

ballPerson::ballPerson (this=0x7fffffffe400)
(gdb) p this
$14 = (ballPerson * const) 0x7fffffffe400
(gdb) p *this
$15 = {<Person> = {age = 4197216}, <No data fields>}

上面看,我们在ballPerson构造函数中,this指向0x7fffffffe400。咨询this,我们发现它已经&#39;一个Person对象,其中包含一个字段age(目前尚未初始化)。

初始化ballPerson构造函数后,只需准备好执行,编译器就会调用Person构造函数。

0x400af0 <ballPerson::ballPerson()+24>  callq  0x400a96 <Person::Person()>

我们可以看到:

Person::Person (this=0x7fffffffe400)
(gdb) p this
$6 = (Person * const) 0x7fffffffe400
(gdb) p *this
$7 = {age = 4197216}

它是Person构造函数,它使用相同的this指针,指向相同的0x7fffffffe400。在此之后,运行ballPerson构造函数中的代码。

换句话说,想象它是C和C ++之间的混合体,代码是:

ballPerson::ballPerson(ballPerson *this)
{
   Person(this);
   this->age = 6;
   std::cout << this->age;
}