为什么继承值打印两次

Why is inherited value printed out twice?

本文关键字:两次 继承 打印 为什么      更新时间:2023-10-16

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

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

这将打印5:

Person p;

这会打印56:

ballPerson bp;

因为Person(基类)构造函数是从ballPerson构造函数调用的。

正如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,我们看到它"有"一个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;
}