copy构造函数的错误

heaven33 2009-05-26 08:23:48
为什么下面的程序编译的时候有错误呢?

# include <iostream>

class A
{
public:
~A(){std::cout << "class A desconstrut" << std::endl;}
A(const A & ch ){std::cout << "class A copy" << std::endl;}
};


class B : public A
{
public:
~B(){std::cout << "class B desconstrut" << std::endl;}
B(const B & ch ){std::cout << "class B copy" << std::endl;}
};

int main()
{

A * b = new B ;

delete b;

int * c = new int(8);
std::cout << *c <<std::endl;

A a;



}
...全文
146 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
注册ID真烦 2009-05-27
  • 打赏
  • 举报
回复
没有缺省的构造函数,在main()又显示调用B的不带参数的构造函数
A * b = new B ;
wangpingfang 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sun451989 的回复:]
引用 5 楼 wangpingfang 的回复:
A * b = new B() ;
调用了一个没有参数的构造函数,但是你的B类里面却没有定义这个构造函数,
如果你自己没有定义拷贝构造函数的话,编译器会帮你生成一个默认的不带参数的构造函数,
但是现在你定义了,所以编译器不会帮你。这样,你调用new B()时就找不到构造函数了。

补句:派生类在调用自己的构造函数前会先调用基类的构造函数。
[/Quote]
恩,漏了点。
Sou2012 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
class B : public A

既然要继承,就尽量让父类A的析构为虚,如果你有显式定义的话.
[/Quote]

UP
「已注销」 2009-05-26
  • 打赏
  • 举报
回复
A(const A & ch ){std::cout << "class A copy" << std::endl;}? 不 明白这语句有什么用? 为什么要用这个????????
sun451989 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangpingfang 的回复:]
A * b = new B() ;
调用了一个没有参数的构造函数,但是你的B类里面却没有定义这个构造函数,
如果你自己没有定义拷贝构造函数的话,编译器会帮你生成一个默认的不带参数的构造函数,
但是现在你定义了,所以编译器不会帮你。这样,你调用new B()时就找不到构造函数了。
[/Quote]
补句:派生类在调用自己的构造函数前会先调用基类的构造函数。
nostopstep 2009-05-26
  • 打赏
  • 举报
回复
说一些关于继承的东东吧:
1、如果想将一个类作为基类,那么就以为着你会有孩子派生出来,这种情况,请将析构函数声明为虚的,但,不要是纯虚的。
原因是,析构函数是从子类到父类来逐步执行的,用delete 删除一个东西,会自动调用它的析构函数。
2、在实现里面添加std不是一个好的方法,最好在类的声明中添加using namespace std;
3、如果缺省构造函数什么都不执行的话,最后不要去声明,免得在别人用你的类的时候出现问题。诸如上面的代码;
光宇广贞 2009-05-26
  • 打赏
  • 举报
回复
A * b = new B ;

你这一行,就需要有默认构造函数。

可是你的类里面定义了类的某种带参数的构造函数,那么你就必须自己显式定义无参数的构造函数的重载。

只要你分别在A与B类里面加上就没问题了。
wangpingfang 2009-05-26
  • 打赏
  • 举报
回复
A * b = new B() ;
调用了一个没有参数的构造函数,但是你的B类里面却没有定义这个构造函数,
如果你自己没有定义拷贝构造函数的话,编译器会帮你生成一个默认的不带参数的构造函数,
但是现在你定义了,所以编译器不会帮你。这样,你调用new B()时就找不到构造函数了。
heaven33 2009-05-26
  • 打赏
  • 举报
回复
为什么必须给出默认构造函数呢、
liliangbao 2009-05-26
  • 打赏
  • 举报
回复
必须给出A和B的默认构造函数~
  • 打赏
  • 举报
回复
class B : public A

既然要继承,就尽量让父类A的析构为虚,如果你有显式定义的话.
机智的呆呆 2009-05-26
  • 打赏
  • 举报
回复

# include <iostream>

class A
{
public:
~A()
{
std::cout << "class A desconstrut" << std::endl;
}
A(const A & ch )
{
std::cout << "class A copy" << std::endl;
}
A()
{
}
};


class B : public A
{
public:
~B()
{
std::cout << "class B desconstrut" << std::endl;
}
B(const B & ch )
{
std::cout << "class B copy" << std::endl;
}
B()
{
}
};

int main()
{

A * b = new B() ;
delete b;
int * c = new int(8);
std::cout << *c <<std::endl;
A a;


}

65,210

社区成员

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

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