3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Composition or inheritance</title>
5 <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
7 <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
8 <link rel="up" href="../move.html" title="Chapter 16. Boost.Move">
9 <link rel="prev" href="implementing_movable_classes.html" title="Implementing copyable and movable classes">
10 <link rel="next" href="movable_only_classes.html" title="Movable but Non-Copyable Types">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
15 <td align="center"><a href="../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="implementing_movable_classes.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../move.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="movable_only_classes.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="move.composition_inheritance"></a><a class="link" href="composition_inheritance.html" title="Composition or inheritance">Composition or inheritance</a>
28 </h2></div></div></div>
30 For classes made up of other classes (via either composition or inheritance),
31 the move constructor and move assignment can be easily coded using the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span></code>
36 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">Base</span>
37 <span class="special">{</span>
38 <span class="identifier">BOOST_COPYABLE_AND_MOVABLE</span><span class="special">(</span><span class="identifier">Base</span><span class="special">)</span>
40 <span class="keyword">public</span><span class="special">:</span>
41 <span class="identifier">Base</span><span class="special">(){}</span>
43 <span class="identifier">Base</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Base</span> <span class="special">&</span><span class="identifier">x</span><span class="special">)</span> <span class="special">{/**/}</span> <span class="comment">// Copy ctor</span>
45 <span class="identifier">Base</span><span class="special">(</span><span class="identifier">BOOST_RV_REF</span><span class="special">(</span><span class="identifier">Base</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{/**/}</span> <span class="comment">// Move ctor</span>
47 <span class="identifier">Base</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">BOOST_RV_REF</span><span class="special">(</span><span class="identifier">Base</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span>
48 <span class="special">{/**/</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> <span class="comment">// Move assign</span>
50 <span class="identifier">Base</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">BOOST_COPY_ASSIGN_REF</span><span class="special">(</span><span class="identifier">Base</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span>
51 <span class="special">{/**/</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> <span class="comment">// Copy assign</span>
53 <span class="keyword">virtual</span> <span class="identifier">Base</span> <span class="special">*</span><span class="identifier">clone</span><span class="special">()</span> <span class="keyword">const</span>
54 <span class="special">{</span> <span class="keyword">return</span> <span class="keyword">new</span> <span class="identifier">Base</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> <span class="special">}</span>
56 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">Base</span><span class="special">(){}</span>
57 <span class="special">};</span>
59 <span class="keyword">class</span> <span class="identifier">Member</span>
60 <span class="special">{</span>
61 <span class="identifier">BOOST_COPYABLE_AND_MOVABLE</span><span class="special">(</span><span class="identifier">Member</span><span class="special">)</span>
63 <span class="keyword">public</span><span class="special">:</span>
64 <span class="identifier">Member</span><span class="special">(){}</span>
66 <span class="comment">// Compiler-generated copy constructor...</span>
68 <span class="identifier">Member</span><span class="special">(</span><span class="identifier">BOOST_RV_REF</span><span class="special">(</span><span class="identifier">Member</span><span class="special">))</span> <span class="special">{/**/}</span> <span class="comment">// Move ctor</span>
70 <span class="identifier">Member</span> <span class="special">&</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">BOOST_RV_REF</span><span class="special">(</span><span class="identifier">Member</span><span class="special">))</span> <span class="comment">// Move assign</span>
71 <span class="special">{/**/</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span>
73 <span class="identifier">Member</span> <span class="special">&</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">BOOST_COPY_ASSIGN_REF</span><span class="special">(</span><span class="identifier">Member</span><span class="special">))</span> <span class="comment">// Copy assign</span>
74 <span class="special">{/**/</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span>
75 <span class="special">};</span>
77 <span class="keyword">class</span> <span class="identifier">Derived</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">Base</span>
78 <span class="special">{</span>
79 <span class="identifier">BOOST_COPYABLE_AND_MOVABLE</span><span class="special">(</span><span class="identifier">Derived</span><span class="special">)</span>
80 <span class="identifier">Member</span> <span class="identifier">mem_</span><span class="special">;</span>
82 <span class="keyword">public</span><span class="special">:</span>
83 <span class="identifier">Derived</span><span class="special">(){}</span>
85 <span class="comment">// Compiler-generated copy constructor...</span>
87 <span class="identifier">Derived</span><span class="special">(</span><span class="identifier">BOOST_RV_REF</span><span class="special">(</span><span class="identifier">Derived</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="comment">// Move ctor</span>
88 <span class="special">:</span> <span class="identifier">Base</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">Base</span><span class="special">&>(</span><span class="identifier">x</span><span class="special">))),</span>
89 <span class="identifier">mem_</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">mem_</span><span class="special">))</span> <span class="special">{</span> <span class="special">}</span>
91 <span class="identifier">Derived</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">BOOST_RV_REF</span><span class="special">(</span><span class="identifier">Derived</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="comment">// Move assign</span>
92 <span class="special">{</span>
93 <span class="identifier">Base</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">Base</span><span class="special">&>(</span><span class="identifier">x</span><span class="special">)));</span>
94 <span class="identifier">mem_</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">mem_</span><span class="special">);</span>
95 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
96 <span class="special">}</span>
98 <span class="identifier">Derived</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">BOOST_COPY_ASSIGN_REF</span><span class="special">(</span><span class="identifier">Derived</span><span class="special">)</span> <span class="identifier">x</span><span class="special">)</span> <span class="comment">// Copy assign</span>
99 <span class="special">{</span>
100 <span class="identifier">Base</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">const</span> <span class="identifier">Base</span><span class="special">&>(</span><span class="identifier">x</span><span class="special">));</span>
101 <span class="identifier">mem_</span> <span class="special">=</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">mem_</span><span class="special">;</span>
102 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
103 <span class="special">}</span>
104 <span class="comment">// ...</span>
105 <span class="special">};</span>
109 <div class="important"><table border="0" summary="Important">
111 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
112 <th align="left">Important</th>
114 <tr><td align="left" valign="top"><p>
115 Due to limitations in the emulation code, a cast to <code class="computeroutput"><span class="identifier">Base</span>
116 <span class="special">&</span></code> is needed before moving the
117 base part in the move constructor and call Base's move constructor instead
118 of the copy constructor.
122 Each subobject will now be treated individually, calling move to bind to the
123 subobject's move constructors and move assignment operators. <code class="computeroutput"><span class="identifier">Member</span></code> has move operations coded (just like
124 our earlier <code class="computeroutput"><span class="identifier">clone_ptr</span></code> example)
125 which will completely avoid the tremendously more expensive copy operations:
129 <pre class="programlisting"><span class="identifier">Derived</span> <span class="identifier">d</span><span class="special">;</span>
130 <span class="identifier">Derived</span> <span class="identifier">d2</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">d</span><span class="special">));</span>
131 <span class="identifier">d2</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">d</span><span class="special">);</span>
136 Note above that the argument x is treated as a lvalue reference. That's why
137 it is necessary to say <code class="computeroutput"><span class="identifier">move</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>
138 instead of just x when passing down to the base class. This is a key safety
139 feature of move semantics designed to prevent accidently moving twice from
140 some named variable. All moves from lvalues occur explicitly.
143 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
144 <td align="left"></td>
145 <td align="right"><div class="copyright-footer">Copyright © 2008-2010 Ion Gaztanaga<p>
146 Distributed under the Boost Software License, Version 1.0. (See accompanying
147 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
152 <div class="spirit-nav">
153 <a accesskey="p" href="implementing_movable_classes.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../move.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="movable_only_classes.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>