C++ 指向派生类的指针是否首先创建基类?

C++ 指向派生类的指针是否首先创建基类?,c++,pointers,inheritance,derived-class,base-class,C++,Pointers,Inheritance,Derived Class,Base Class,我有以下代码 #include <iostream> using namespace std; class B{ int i; public: B(){ cout << "Constructing B\n"; } void print(){ cout << "Printing from B with size : "<<sizeof(*this)<<endl;

我有以下代码

#include <iostream>
using namespace std;

class B{
    int i;
    public:
    B(){
        cout << "Constructing B\n";
    }
    void print(){
        cout << "Printing from B with size : "<<sizeof(*this)<<endl;
    }
};



class D:public B{
    int i;
    public:
    D(){
        cout << "Constructing D\n";
    }
    void print(){
        cout << "Printing from D with size : "<<sizeof(*this)<<endl;
    }
};


int main(){

    B b;
    b.print();
    D d;
    d.print();

    D* dp;
    dp->print();
}

那么,当您创建一个指向派生类的指针时,它并没有首先创建基类的实例,这是真的吗?我不认为这是真的,因为D类的大小就是证明。但它甚至没有调用基类构造函数。有人能解释一下吗?

指针不会产生任何东西。指针只是指针——包含地址的标量对象。让指针指向内存中的正确位置是您的责任


在您的示例中,指针
dp
未初始化。你从来没有指向过任何地方,所以它没有指向任何地方。您试图调用
dp->print()
会产生未定义的行为。故事结束。

现在您的指针根本没有初始化,因此尝试使用它会产生未定义的行为。尝试以下方法:

D *dp = new D; 
dp->print();
delete dp;
或者做得更好,比如:

std::unique_ptr<D> dp = std::make_unique<D>();
dp->print();
B *p = std::make_unique<D>();
p->print(); // would invoke B::print, even though the object is a D
…当它超出范围时,它将被错误地销毁,因此您将获得未定义的行为。要更正此问题,您需要将B更改为以下内容:

class B{
    int i;
    public:
    B(){
        cout << "Constructing B\n";
    }
    virtual void print(){
        cout << "Printing from B with size : "<<sizeof(*this)<<endl;
    }
    virtual ~B() = default;
};
B类{
int i;
公众:
B(){

cout您可以使用强大的多态性
Base
对象分配一个
Derived
指针。这是可能的,因为
Derived
实现
Base
包含的所有内容。因此,
Derived
底层在其运行期间实例化
Base
n实例化

class Base
{
public:
    Base()
    {}
}

class Derived : public Base
{
public:
    Derived()
    {}
}

Derived *derived = new Derived();
Base *base = derived;

它在派生类之前构造基类。您的输出反映了这一点。看这个

//Constructs Base class
Constructing B
//Constructs Derived class
Constructing D
//Prints from derived
Printing from D with size : 8
您的代码在不调用构造函数的情况下从D打印两次大小为8的
是因为您的代码从未创建
D
的第二个实例

D* d;
^^^^ Declares a pointer to a D, Does not create a D!
当您调用
d->print();
时,这是未定义的行为,因为
d
没有指向
d
的实例。最后,您的代码打印在编译时确定的值(
sizeof(d)
是编译时的值),并且不触摸代码运行的
指针


请参阅
sizeof

的文档,这里,
D*dp;dp->print();
是未定义的行为。它可以打印任何内容或任何内容。当您“创建指向派生类的指针”时,它不会创建任何对象(指针本身除外)。那么为什么dp指向的内存大小是8。这就是我想知道的。相关问题:它为什么不能格式化你的硬盘?@davidhigh-lol我知道指针的威力。它们非常棒。
D* d;
^^^^ Declares a pointer to a D, Does not create a D!