我正在练习继承,我有一个名为Person
的基类。 Person
有一个名为age
的变量,在Person
类构造函数中,我将age
设置为5
并将年龄打印到屏幕上。我有另一个名为ballPerson
的类,它从age
继承Person
并将age
设置为6
。当我为Person
班级和ballPerson
班级创建对象时,会打印出值5
(age
类中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;
}
答案 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;
}