gpt4 book ai didi

c++ - 类包含复制构造函数和赋值运算符时的继承行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:27 27 4
gpt4 key购买 nike

我无法理解这种行为。我有一个A级,

class A
{
public:
int ch;
char *s;
A()
{}
A(char *st):ch(0)
{
s = new char[10];
strcpy(s,st);

}
A(const A& rhs):ch(rhs.ch)
{
s = new char[strlen(rhs.s)+1];
strcpy(s,rhs.s);
}
const A& operator=(const A& rhs)
{
char *temp = new char[strlen(rhs.s)+1];
strcpy(temp,rhs.s);
delete[] s;
s=temp;
ch = rhs.ch;
return *this;
}
~A()
{
delete []s;
}
};

到目前为止,一切都按预期进行,我能够测试我的复制构造函数和赋值运算符,它们工作正常。

现在我创建了一个子类 B,但出现了堆损坏错误。我无法理解,这是与 A 类析构函数相关的问题吗? ? 下面是我的 B 类,

class B:public A
{

public:
int a;
B():a(0){}
};

最佳答案

A 的默认构造函数不会初始化成员 s(指针):

A()
{}

因此,当使用此构造函数构造元素时,当析构函数删除未初始化的元素时会发生崩溃:

~A()
{
delete []s;
}

B 使用 A 的默认构造函数,因此会触发此问题。通过在默认构造函数中正确初始化所有成员来避免它:

A() : ch(), s(0)
{ }

关于c++ - 类包含复制构造函数和赋值运算符时的继承行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14153347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com