只有在创建类的对象的情况下才调用构造函数吗?

Inv*_*tus 0 c++ inheritance constructor

我现在知道在创建对象时调用构造函数.我也知道它不可能创建一个抽象类的对象.

但是,当我运行这段代码时,我看到以下内容: -

#include <iostream>

using namespace std;

class Pet {
public:
    Pet(){cout<<"in base constructor\n";}

    virtual ~Pet() = 0;  //making pet abstract by making drstructor pure virtual
};

Pet::~Pet() {
    cout << "~Pet()" << endl;
}

class Dog : public Pet {
    public:
    Dog(){cout<<"in drvd constructor\n";}

    ~Dog() {
        cout << "~Dog()" << endl;
    }
};

int main() {
    Pet* p = new Dog; // Upcast
    delete p; // Virtual destructor call
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行时其输出为: -

in base constructor
in drvd constructor
~Dog()
~Pet()
Run Code Online (Sandbox Code Playgroud)

为什么Pet的构造函数被调用,即使它是一个抽象类而且不允许创建对象?所以它归结为最终只是在对象创建的情况下被调用的构造函数?

Luc*_*ore 6

它不可能创建抽象类的对象

不要把这个ad-litteram.您无法创建实际类型为抽象的对象.

但是,如果您实现该类(扩展它并在其中实现所有纯虚方法)并实例化新类,则将创建原始抽象基类的对象作为新类的一部分.

继承是一种is-a关系.Dog是一个Pet.创建时Dog,创建一个Pet.但你不能自己创造一个Pet.