strcpy的的使用方法


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。

  1. base* ptr = new derived; 这行代码创建了一个指向derived对象的base指针ptr。在内存中,先创建了一个derived对象,然后将其地址分配给ptr。

  2. 构造函数base::base()被调用。 在base构造函数中,base1指针被动态分配2个字符的内存,然后将字符串"1"复制到base1中,并且输出"2"。

  3. 构造函数derived::derived()被调用。 在derived构造函数中,derived1指针被动态分配2个字符的内存,然后将字符串"4"复制到derived1中,并且输出"5"。

  4. ptr->print(); 调用ptr所指向对象的print函数。由于ptr的静态类型是base指针,虽然它指向一个derived对象,但会调用base类中的print函数。因此会打印base1的值,即"1"。

  5. delete ptr; 删除ptr指向的对象。首先调用析构函数derived::~derived(),删除derived1指针指向的内存,并且输出"6"。接着调用析构函数base::~base(),删除base1指针指向的内存,并且输出"3"。

因此,最终的输出结果是2513,其中"1"是因为调用了base类的构造函数,"2"是在base类的构造函数中输出的,"5"是在derived类的构造函数中输出的,"3"是在base类的析构函数中输出的。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^