background image

2     public: 
3         virtual void run() {} 
4     } 
5      
6     class SentObjectTask { 
7     public: 
8         virtual void run() {} 
9     }
10 
11     class TcpServerSentTask : public TcpServerTask, public SentObjectTask { }
  2. 

 

对象克隆: Object 对象中存在 protected 类型的 clone 方法,该方法将会完成子

类对象 clone 的缺省操作,既对象域字段的浅拷贝,如果该对象的成员均为原始类型,如
int、float 等,或者为不可变类型,如 String。这样的浅拷贝将能够达到对象 clone 的预期。换
言之,如果对象内部存在可变对象的引用,浅拷贝将会带来原始对象和 cloned 对象引用
相同对象引用的问题。如果希望避免该问题的发生,子类需要实现 Cloneable 接口。这里需
要指出的是 Cloneable 接口并未提供 clone 方法,只是提供了一种契约签名。子类真正做的
还是重载 Object 方法中的 clone 方法,由于 Object 中该方法为 protected 方法,所以 caller
不能直接调用它,只能将子类的 clone 方法声明为共有类型,caller 才能调用。

1     //

 

该实现类使用浅拷贝已经可以满足其需要了

2     public class implements Cloneable { 
3         //这里已经提升了 clone 方法的级别为 public

 

4         public Employee clone() throws CloneNotSupportedException { 
5             return (Employee)super.clone(); 
6         } 
7     } 
8     //深拷贝 clone 方法,必须 clone 对象内部所有可变的实例域,

 

其中这些可变类

9     //必须全部都实现了自己的 clone 方法,否则将会跑出异常。
10     public class Employee implements Cloneable {
11         public Employee clone() throws CloneNotSupportedException {
12             //缺省 clone 完成了域字段的按位浅拷贝。
13             Employee cloned = (Employee)super.clone();
14             cloned.hireday = (Date)hireday.clone();
15         }
16         private Date hireday;
17     }
  注:数组对象可以通过 Array 的 clone(public)方法完成元素的拷贝。
  在 C++中由于并不存在 Object 这样的单根结构的框架,因此 C++是以另外一种

方式表现该问题的,既缺省拷贝构造和缺省等于操作符重载。和 Java 类似,这两个方法也
是 member bitwise 拷贝的,但这是由编译器在生成对象模型时自动完成的缺省行为,如
果该类重载了拷贝构造函数和等于操作符,在需要 copy 的时候则会调用重载后的方法,
类的实现者应该在这两个方法中完成深拷贝。C++中还可以通过将这两个方法显示的声明
为 private 类型的方法来禁用这种对象之间的 copy 行为,一旦出现,编译器将会在在编译
器报错。在 C++中还存在一个 explicit 的关键字,可以有效的防止编译器通过自行推演隐
式的调用对象的拷贝构造函数和等于操作符函数,见如下代码: