【发布时间】:2021-12-08 18:14:58
【问题描述】:
我目前正在学习 C++,并想了解构造函数在继承上下文中的工作方式。这是我的父类和子类:
#include <iostream>
#include <string>
enum COLOR { Green, Blue, White, Black, Brown, };
class Animal
{
protected:
std::string _name;
COLOR _color;
public:
Animal(): _name("unknown"){
std::cout << "constructing Animal object " << _name << std::endl;
}
Animal(std::string animalName, COLOR animalColor){
_name = animalName;
_color = animalColor;
std::cout << "constructing ";
std::cout<< _color;
std::cout << " Animal object " << _name << std::endl;
}
~Animal(){
std::cout << "destructing Animal object " << _name << std::endl;
}
void speak(){
std::cout << "Animal speaks" << std::endl;
}
void move() const {}
private:
};
class Mammal: public Animal{
public:
Mammal():Animal(){}
Mammal(std::string mammalName, COLOR animalColor)
:Animal(mammalName, animalColor){}
~Mammal(){
std::cout << "Destructing Mammal object " << _name << std::endl;
}
void eat() const{
std::cout << "Mammal eat" << std::endl;
}
private:
};
class Dog: public Mammal{
public:
Dog():Mammal(){}
Dog(std::string dogName, COLOR dogColor)
:Mammal(dogName, dogColor){}
~Dog(){
std::cout << "Destructing Dog object " << _name << std::endl;
}
private:
};
这是我的主要内容:
int main(){
Animal a;
a.speak();
Animal b("Boar", Blue);
b.speak();
Mammal m("Monkey", Black);
m.speak();
Dog d("Panda", Brown);
std::cout << "Program exiting..." << std::endl;
return 0;
}
这是输出的样子:
constructing Animal object unknown
Animal speaks
constructing 1 Animal object Boar
Animal speaks
constructing 3 Animal object Monkey
Animal speaks
constructing 4 Animal object Panda
Program exiting...
Destructing Dog object Panda
Destructing Mammal object Panda
destructing Animal object Panda
Destructing Mammal object Monkey
destructing Animal object Monkey
destructing Animal object Boar
destructing Animal object unknown
Process returned 0 (0x0) execution time : 1.102 s
我很好奇的是析构函数语句。似乎如果我将析构函数添加到子类(构造函数似乎也是如此),您会看到子类的析构函数运行,然后父类的析构函数也运行。 因此你的析构函数顺序是 Dog -> Mammal -> Animal。这是什么意思? 这是否意味着 C++ 已经初始化了 3 个实例化对象只是为了生成 1 个 Dog 对象? 析构函数(和构造函数)的流程在这里如何工作?
【问题讨论】:
标签: c++ inheritance constructor polymorphism