为什么继承值打印两次
Why is inherited value printed out twice?
我正在练习继承,我有一个名为Person
的基类。Person
有一个名为age
的变量,在Person
类构造函数中,我将age
设置为5
,并在屏幕上打印年龄。我有另一个名为ballPerson
的类,它从Person
继承了age
,并将age
设置为等于6
。当我为Person
类和ballPerson
类创建对象时,值5
(Person
类中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;
}
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- 在钻石问题的求解中,为什么要虚拟地继承两次grand-parent类
- C++两次从文件保存对象读取多重继承
- 如何修复从基类继承两次时"error: no matching function for call to"
- 在C++中继承同一类两次(故意)
- 为什么基类被继承两次,即使其中一个是虚拟继承的
- 为什么继承值打印两次
- 两次派生的菱形继承-构造函数参数不同-指定虚拟继承时无法找到基
- 同一个类你能继承两次吗