1<html lang="en"> 2<head> 3<title>Copy Assignment - Using the GNU Compiler Collection (GCC)</title> 4<meta http-equiv="Content-Type" content="text/html"> 5<meta name="description" content="Using the GNU Compiler Collection (GCC)"> 6<meta name="generator" content="makeinfo 4.13"> 7<link title="Top" rel="start" href="index.html#Top"> 8<link rel="up" href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings" title="C++ Misunderstandings"> 9<link rel="prev" href="Temporaries.html#Temporaries" title="Temporaries"> 10<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> 11<!-- 12Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 131998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 142010 Free Software Foundation, Inc. 15 16Permission is granted to copy, distribute and/or modify this document 17under the terms of the GNU Free Documentation License, Version 1.3 or 18any later version published by the Free Software Foundation; with the 19Invariant Sections being ``Funding Free Software'', the Front-Cover 20Texts being (a) (see below), and with the Back-Cover Texts being (b) 21(see below). A copy of the license is included in the section entitled 22``GNU Free Documentation License''. 23 24(a) The FSF's Front-Cover Text is: 25 26 A GNU Manual 27 28(b) The FSF's Back-Cover Text is: 29 30 You have freedom to copy and modify this GNU Manual, like GNU 31 software. Copies published by the Free Software Foundation raise 32 funds for GNU development.--> 33<meta http-equiv="Content-Style-Type" content="text/css"> 34<style type="text/css"><!-- 35 pre.display { font-family:inherit } 36 pre.format { font-family:inherit } 37 pre.smalldisplay { font-family:inherit; font-size:smaller } 38 pre.smallformat { font-family:inherit; font-size:smaller } 39 pre.smallexample { font-size:smaller } 40 pre.smalllisp { font-size:smaller } 41 span.sc { font-variant:small-caps } 42 span.roman { font-family:serif; font-weight:normal; } 43 span.sansserif { font-family:sans-serif; font-weight:normal; } 44--></style> 45<link rel="stylesheet" type="text/css" href="../cs.css"> 46</head> 47<body> 48<div class="node"> 49<a name="Copy-Assignment"></a> 50<p> 51Previous: <a rel="previous" accesskey="p" href="Temporaries.html#Temporaries">Temporaries</a>, 52Up: <a rel="up" accesskey="u" href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings">C++ Misunderstandings</a> 53<hr> 54</div> 55 56<h4 class="subsection">11.8.4 Implicit Copy-Assignment for Virtual Bases</h4> 57 58<p>When a base class is virtual, only one subobject of the base class 59belongs to each full object. Also, the constructors and destructors are 60invoked only once, and called from the most-derived class. However, such 61objects behave unspecified when being assigned. For example: 62 63<pre class="smallexample"> struct Base{ 64 char *name; 65 Base(char *n) : name(strdup(n)){} 66 Base& operator= (const Base& other){ 67 free (name); 68 name = strdup (other.name); 69 } 70 }; 71 72 struct A:virtual Base{ 73 int val; 74 A():Base("A"){} 75 }; 76 77 struct B:virtual Base{ 78 int bval; 79 B():Base("B"){} 80 }; 81 82 struct Derived:public A, public B{ 83 Derived():Base("Derived"){} 84 }; 85 86 void func(Derived &d1, Derived &d2) 87 { 88 d1 = d2; 89 } 90</pre> 91 <p>The C++ standard specifies that ‘<samp><span class="samp">Base::Base</span></samp>’ is only called once 92when constructing or copy-constructing a Derived object. It is 93unspecified whether ‘<samp><span class="samp">Base::operator=</span></samp>’ is called more than once when 94the implicit copy-assignment for Derived objects is invoked (as it is 95inside ‘<samp><span class="samp">func</span></samp>’ in the example). 96 97 <p>G++ implements the “intuitive” algorithm for copy-assignment: assign all 98direct bases, then assign all members. In that algorithm, the virtual 99base subobject can be encountered more than once. In the example, copying 100proceeds in the following order: ‘<samp><span class="samp">val</span></samp>’, ‘<samp><span class="samp">name</span></samp>’ (via 101<code>strdup</code>), ‘<samp><span class="samp">bval</span></samp>’, and ‘<samp><span class="samp">name</span></samp>’ again. 102 103 <p>If application code relies on copy-assignment, a user-defined 104copy-assignment operator removes any uncertainties. With such an 105operator, the application can define whether and how the virtual base 106subobject is assigned. 107 108 </body></html> 109 110