class base
{
char* base1;
public:
base()
{
base1 = new char[2];
strcpy(base1, "1");
cout << "2";
}
~base()
{
delete[]base1;
cout << "3";
}
void print()
{
cout << base1;
}
};
class derived :public base
{
char* derived1;
public:
derived()
{
derived1 = new char[2];
strcpy(derived1, "4");
cout << "5";
}
~derived()
{
delete[]derived1;
cout << "6";
}
void print()
{
cout << derived1;
}
};
int main()
{
base* ptr = new derived;
ptr->print();
delete ptr;
return 0;
}
为什么结果是2513,1是怎么来的
这道题考的应该是构造和析构的顺序,说起来有些麻烦,你自己去查查资料吧
ptr->print(); 这里打印的 base1
【以下回答由 GPT 生成】
在这段代码中,我们有两个类,base和derived。base类有一个成员变量base1和一个构造函数,构造函数会动态分配2个字符的内存,并将字符串"1"复制到base1中。derived类继承自base类,有一个成员变量derived1和一个构造函数,构造函数也会动态分配2个字符的内存,并将字符串"4"复制到derived1中。
我们在main函数中创建了一个base指针ptr,指向一个新创建的derived对象。接着调用ptr的print函数,该函数会打印derived1的值,即"4"。最后释放ptr指向的内存。
现在让我们逐行分析代码的执行过程来解释为什么结果是2513。
base* ptr = new derived;
这行代码创建了一个指向derived对象的base指针ptr。在内存中,先创建了一个derived对象,然后将其地址分配给ptr。
构造函数base::base()
被调用。 在base构造函数中,base1指针被动态分配2个字符的内存,然后将字符串"1"复制到base1中,并且输出"2"。
构造函数derived::derived()
被调用。 在derived构造函数中,derived1指针被动态分配2个字符的内存,然后将字符串"4"复制到derived1中,并且输出"5"。
ptr->print();
调用ptr所指向对象的print函数。由于ptr的静态类型是base指针,虽然它指向一个derived对象,但会调用base类中的print函数。因此会打印base1的值,即"1"。
delete ptr;
删除ptr指向的对象。首先调用析构函数derived::~derived(),删除derived1指针指向的内存,并且输出"6"。接着调用析构函数base::~base(),删除base1指针指向的内存,并且输出"3"。
因此,最终的输出结果是2513,其中"1"是因为调用了base类的构造函数,"2"是在base类的构造函数中输出的,"5"是在derived类的构造函数中输出的,"3"是在base类的析构函数中输出的。
【相关推荐】