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!