关于类的继承请教

z75050429 2009-02-01 12:19:29
#include <iostream>
using namespace std;
class A
{
private:
int *a3;
public:
A(){cout<<'A'<<endl;}
A(int x){a3= new int[x];};
~A(){delete []a3;cout<<"析构函数A"<<endl;};

};

class B:public A
{
private:
int *a3;
public:
B(int x){a3= new int[x];};
~B(){delete []a3;cout<<"析构函数B"<<endl;};
B(){};
};
int main()
{
A<int> a(1);
B<int> b(1);
return 0;
}
为什么析构函数不出错,怎么改??谢谢指点
...全文
148 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-02-01
  • 打赏
  • 举报
回复
你到底想问什么?A,B又不是模板类,怎么会有A<int> a(1)这样定义?
Cpp权哥 2009-02-01
  • 打赏
  • 举报
回复
“为什么不出错”?
好奇怪,要想出错很容易,你只要在想出错的地方乱输入一些东西就行了。
malotita 2009-02-01
  • 打赏
  • 举报
回复
没看出出错的地方
z75050429 2009-02-01
  • 打赏
  • 举报
回复
我照你的程序改过了··正确了··这个是哪里的错误呢???
arong1234 2009-02-01
  • 打赏
  • 举报
回复
出什么错都不说,等人家猜什么呢
[Quote=引用 5 楼 z75050429 的回复:]
我本来是用模板写的,然后改成类的,主函数忘记改了···你可以改过编译一下你会发现B类的析构函数要出错
[/Quote]
z75050429 2009-02-01
  • 打赏
  • 举报
回复
我本来是用模板写的,然后改成类的,主函数忘记改了···你可以改过编译一下你会发现B类的析构函数要出错
waizqfor 2009-02-01
  • 打赏
  • 举报
回复

int main()
{
A <int> a(1);//哥们A是类 不是摸版定义就错了 A a(1);这样调用构造函数和析构啊
B <int> b(1); //同上
return 0;
}
OenAuth.Net 2009-02-01
  • 打赏
  • 举报
回复
你从哪看的析构函数要出错?
lightnut 2009-02-01
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

class A
{
private:
int *a3;

public:
A():a3(NULL)
{
cout <<"A()" <<endl;
}

A(int x)
{
cout <<"A(x)" <<endl;
a3= new int[x];
}

virtual ~A()
{
if (NULL!=a3) delete []a3;
cout <<"析构函数A" <<endl;
}
};

class B:public A
{
public:
B()
{
cout <<"B()" <<endl;
};

B(int x):A(x)
{
cout <<"B(x)" <<endl;
}

virtual ~B()
{
cout <<"析构函数B" <<endl;
}
};

int main()
{
A a(1);
B b(1);
return 0;
}

nineforever 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiaoyisnail 的回复:]
C/C++ code
B b(1);//这时编译器会调用b的父类子对象的默认构造函数A(),但是A()没有初始化A的成员a3,a3是野指针,当退出main时,析构b后编译器会自动调用b的父类子对象的析构函数~A(),此时delete一个野指针a3,所以报错
[/Quote]

re,B::A::a3必然是野指针,而且B::a3还hide了B::A::a3
waizqfor 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chenzongquan1973 的回复:]
“为什么不出错”?
好奇怪,要想出错很容易,你只要在想出错的地方乱输入一些东西就行了。
[/Quote]
挺有意思
xiaoyisnail 2009-02-01
  • 打赏
  • 举报
回复

B b(1);//这时编译器会调用b的父类子对象的默认构造函数A(),但是A()没有初始化A的成员a3,a3是野指针,当退出main时,析构b后编译器会自动调用b的父类子对象的析构函数~A(),此时delete一个野指针a3,所以报错
Vitin 2009-02-01
  • 打赏
  • 举报
回复
因为 B 调用 A 的默认构造函数,后者没有对 A::x3 赋初值,在 A::~A() 中 delete 造成错误。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧