小众知识

首页 > 正文

关于虚复制构造函数的问题?

我现在正在学习c++,看到虚复制构造函数这一节以后,觉得看的不是很明白。我想请问各位大侠,在什么情况下才会用到虚复制构造函数。书上说有时程序需要传递基类对象指针,并能够为派生类对象创建正确的副本。接下来就写了一个程序,搞的我恩迷茫。
 

 sam1111 发表于:2003-07-30 10:39:08
得分:0 

不懂,构造函数有虚的吗 

 magic007 发表于:2003-07-30 11:52:04
得分:0 

没有所谓的虚Virtual Copy constructor
不过经常存在以下的情况:
如有base class:Base
derived class:Derived1和Derived2,皆从Base继承而来
在程序中,
Base *p1,*p2;
p1=new Derived1();
假如要copy p1为p2
  p2=p1->copy();
copy一般这样定义
virtual Derived1 * copy()
{
  return new Derived1(*this);
}
就是相当于给copy constructor加了个中间层,这也许是称之为virtual copy 的由来吧 

 njtu 发表于:2003-07-30 18:07:09
得分:0 

接  magic007(无名):

这样可以防止切割问题的产生:
Base *p1,*p2;
p1=new Derived1();
假如要copy p1为p2
  p2=p1->copy();

如果copy()不是虚函数则会调用 base::copy()
Drived1的非base部分的信息将被丢弃。

 EdithZt 发表于:2003-08-01 08:47:10
得分:0 

结合楼上的,为避免指针指向同一个对象以及c++本身的静态类型检查,需要在基类里提供一个copy()  = 0,以此来进行对象的复制。 

 mechgoukiteng 发表于:2003-08-01 09:08:25
得分:0 

这是一种idiom

可以提供灵活性,我记得FAQ里面应该有讲,可以在适合的地方,比如你自己需要些个类工厂完成序列化的功能时候多使用 

 ergo 发表于:2003-08-28 03:06:44
得分:0 

构造函数唯一有的只可以是inline 

 nazha 发表于:2003-08-30 21:39:09
得分:0 

class中析构函数是可以为虚,任何形式的构造函数都不可以为虚 

 xiaoyunet 发表于:2003-09-01 09:54:39
得分:0 

就是对象克隆.可蚕茧设计模式中的原型模式 

 capcomtechnos 发表于:2003-09-01 14:10:14
得分:0 

所以应该是
virtual Base * copy()
{
  return new Derived1(*this);
}

而不是Derived1 * 

 robertnet 发表于:2003-09-06 12:56:13
得分:0 

楼主所说的可是"拷贝构造函数"? 

上一篇:学习顺序之疑问:如果没有C基础,直接学C++的I/O流类可以吗?有什么难度,需要注意些什么,重要难度在哪里?(今天没有分了)
下一篇:看了看c++ primer plus,有两个问题,请进

分享到: