ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل یازدهم در « ترکیب و وراثت » ++C

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:65539 0 0 0 1 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131072 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:2097152 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:4194304 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-2147459008 0 128 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421319 -2147483648 8 0 66047 0;} @font-face {font-family:"Adobe Caslon Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Caslon Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Arno Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Light Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bell Gothic Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bell Gothic Std Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bickham Script Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Bickham Script Pro Semibold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Birch Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackoak Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Brush Script Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Chaparral Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Charlemagne Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cooper Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eccentric Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Garamond Premr Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Garamond Premr Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Giddyup Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Hobo Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Letter Gothic Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lithos Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Mesquite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Minion Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Med"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro SmBd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Nueva Std Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"OCR A Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Orator Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Poplar Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Prestige Elite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rosewood Std Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Stencil Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tekton Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Ext"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Trajan Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:Marlett; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Console"; panose-1:2 11 6 9 4 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482993 6144 0 0 31 0;} @font-face {font-family:"Lucida Sans Unicode"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-2147476737 14699 0 0 63 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"Arial Black"; panose-1:2 11 10 4 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Comic Sans MS"; panose-1:3 15 7 2 3 3 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Impact; panose-1:2 11 8 6 3 9 2 5 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium"; panose-1:2 11 6 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870009 1073741843 0 0 415 0;} @font-face {font-family:"Trebuchet MS"; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Webdings; panose-1:5 3 1 2 1 5 9 6 7 3; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MV Boli"; panose-1:2 0 5 0 3 2 0 9 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 0 256 0 0 0;} @font-face {font-family:"Microsoft Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421663 -2147483648 8 0 66047 0;} @font-face {font-family:AngsanaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:BrowalliaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:"Browallia New"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:CordiaUPC; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:DilleniaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:EucrosiaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:FreesiaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:IrisUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:JasmineUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:KodchiangUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:LilyUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Aharoni; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:David; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"David Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:FrankRuehl; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Levenim MT"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Miriam; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Fixed"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Fixed Miriam Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Narkisim; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Rod; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Rod Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Traditional Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Arabic Transparent"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Andalus; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic Fixed"; panose-1:2 1 0 9 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Kartika; panose-1:2 2 5 3 3 4 4 6 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:8388611 0 0 0 1 0;} @font-face {font-family:"Agency FB"; panose-1:2 11 5 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Narrow"; panose-1:2 11 5 6 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arial Rounded MT Bold"; panose-1:2 15 7 4 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackadder ITC"; panose-1:4 2 5 5 5 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT"; panose-1:2 7 6 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Black"; panose-1:2 7 10 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Condensed"; panose-1:2 7 6 6 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Book Antiqua"; panose-1:2 4 6 2 5 3 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bookman Old Style"; panose-1:2 5 6 4 5 5 5 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bradley Hand ITC"; panose-1:3 7 4 2 5 3 2 3 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Calisto MT"; panose-1:2 4 6 3 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Castellar; panose-1:2 10 4 2 6 4 6 1 3 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Century Schoolbook"; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Copperplate Gothic Bold"; panose-1:2 14 7 5 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Copperplate Gothic Light"; panose-1:2 14 5 7 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Curlz MT"; panose-1:4 4 4 4 5 7 2 2 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Edwardian Script ITC"; panose-1:3 3 3 2 4 7 7 13 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Elephant; panose-1:2 2 9 4 9 5 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Engravers MT"; panose-1:2 9 7 7 8 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Bold ITC"; panose-1:2 11 9 7 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Demi ITC"; panose-1:2 11 8 5 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Light ITC"; panose-1:2 11 4 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Medium ITC"; panose-1:2 11 6 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Felix Titling"; panose-1:4 6 5 5 6 2 2 2 10 4; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Forte; panose-1:3 6 9 2 4 5 2 7 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Franklin Gothic Book"; panose-1:2 11 5 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi"; panose-1:2 11 7 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi Cond"; panose-1:2 11 7 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Heavy"; panose-1:2 11 9 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium Cond"; panose-1:2 11 6 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"French Script MT"; panose-1:3 2 4 2 4 6 7 4 6 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Garamond; panose-1:2 2 4 4 3 3 1 1 8 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Gigi; panose-1:4 4 5 4 6 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Gill Sans MT Ext Condensed Bold"; panose-1:2 11 9 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT"; panose-1:2 11 5 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT Condensed"; panose-1:2 11 5 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold"; panose-1:2 11 10 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold Condensed"; panose-1:2 11 10 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gloucester MT Extra Condensed"; panose-1:2 3 8 8 2 6 1 1 1 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Old Style"; panose-1:2 2 5 2 5 3 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Stout"; panose-1:2 2 9 4 7 3 11 2 4 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Haettenschweiler; panose-1:2 11 7 6 4 9 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Imprint MT Shadow"; panose-1:4 2 6 5 6 3 3 3 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans Typewriter"; panose-1:2 11 5 9 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Outlook"; panose-1:5 1 1 0 1 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Maiandra GD"; panose-1:2 14 5 2 3 3 8 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Monotype Corsiva"; panose-1:3 1 1 1 1 2 1 1 1 1; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"OCR A Extended"; panose-1:2 1 5 9 2 1 2 1 3 3; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Palace Script MT"; panose-1:3 3 3 2 2 6 7 12 11 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Papyrus; panose-1:3 7 5 2 6 5 2 3 2 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Perpetua; panose-1:2 2 5 2 6 4 1 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Perpetua Titling MT"; panose-1:2 2 5 2 6 5 5 2 8 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Pristina; panose-1:3 6 4 2 4 4 6 8 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rage Italic"; panose-1:3 7 5 2 4 5 7 7 3 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Rockwell; panose-1:2 6 6 3 2 2 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Condensed"; panose-1:2 6 6 3 5 4 5 2 1 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Extra Bold"; panose-1:2 6 9 3 4 5 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Script MT Bold"; panose-1:3 4 6 2 4 6 7 8 9 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tw Cen MT"; panose-1:2 11 6 2 2 1 4 2 6 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Tw Cen MT Condensed"; panose-1:2 11 6 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Wingdings 2"; panose-1:5 2 1 2 1 5 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Wingdings 3"; panose-1:5 4 1 2 1 8 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Bookshelf Symbol 7"; panose-1:5 1 1 1 1 1 1 1 1 1; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Reference Sans Serif"; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Reference Specialty"; panose-1:5 0 5 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Tw Cen MT Condensed Extra Bold"; panose-1:2 11 8 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"MT Extra"; panose-1:5 5 1 2 1 2 5 2 2 2; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:red;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

فصل یازدهم

C++ در « ترکیب و وراثت »

12 مقدمه ‐1

اغلب اوقات برای ایجاد یک کلاس جدید، نیازی نیست که همه چیز از اول

طراحی شود. می توانیم برای ایجاد کلاس مورد نظر، از تعاریف کلاس هایی که قبلا

ساخته ایم، استفاده نماییم. این باعث صرف هجویی در وقت و استحکام منطق برنامه

می شود. در شی گرایی به دو شیوه می توان این کار را انجام داد: ترکیب 1 و وراثت 2. در

این فصل خواهیم دید که چگونه و چه مواقعی می توانیم از این دو شیوه بهره ببریم.

12 ترکیب ‐2

ترکیب کلاس ها (یا تجمیع کلاس ها) یعنی استفاده از یک یا چند کلاس دیگر در

داخل تعریف یک کلاس جدید. هنگامی که عضو داده ای کلاس جدید، شیئی از کلاس

دیگر باشد، می گوییم که این کلاس جدید ترکیبی از سایر کلاس هاست. به تعریف دو

کلاس زیر نگاه کنید.

1 – Composition 2 – Inheritance

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

358 برنامه سازی پیشرفته

Date 11 کلاس ‐ * مثال 1

را نشان می دهد که اشیای این کلاس برای نگهداری Date کد زیر، کلاس

تاریخ استفاده می شوند.

class Date

{ public:

Date(int y=0, int m=0, int d=0) :

year(y), month(m), day(d) {};

void setDate(int y, int m, int d)

{ year = y; month = m; day = d; }

void getDate()

{ cin >> year >> month >> day ; }

void showDate()

{ cout << year << '/' << month << '/' << day ; }

private:

int year, month, day;

}

int main()

{ Date memory(1359,6,31);

cout << "SADDAM attacked to IRAN at ";

memory.showDate();

memory.setDate(1367,4,27);

cout << "\nThat war finished at ";

memory.showDate();

cout << "\nEnter your birthday: ";

memory.getDate();

cout << "\nYour birthday is ";

memory.showDate();

}

SADDAM attacked to IRAN at 1359/6/31

That war finished at 1367/4/27

Enter your birthday: 1358 6 15

Your birthday is 1358/6/15

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

فصل یازدهم / ترکیب و وراثت 359

 

Book 11 کلاس ‐ * مثال 2

را نشان می دهد که اشیای این کلاس برخی از مشخصات Book کد زیر، کلاس

یک کتاب را نگهداری می کنند:

class Book

{ public:

Book(char* n = " ", int i = 0, int p = 0) :

name(n), id(i), page(p) { }

void printName() { cout << name; }

void printId() { cout << id; }

void printPage() { cout << page; }

private:

string name, author;

int id, page;

}

int main()

{ Book reference("C++", 1, 450);

cout << " reference id pages " << endl;

cout << "-----------------------------" << endl;

cout << " " ; reference.printName();

cout << " " ; reference.printId();

cout << " " ; reference.printPage();

}

reference id pages

-----------------------------

C++ 1 450

را بهبود دهیم Book اکنون می خواهیم با ترکیب این دو کلاس، امکانات کلاس

تا مشخصات یک کتاب و تاریخ انتشار آن را نگهداری کند.

Book 11 بهبود دادن کلاس ‐ * مثال 3

#include "Date.h"

class Book

{ public:

Book(char* n = " ", int i = 0, int p = 0) :

 

 

360 برنامه سازی پیشرفته

name(n), id(i), page(p) { }

void printName() { cout << name; }

void printId() { cout << id; }

void printPage() { cout << page; }

void setDOP(int y, int m, int d)

{ publish.setDate(y, m, d) ; }

void showDOP() { publish.showDate(); }

private:

string name, author;

int id, page;

Date publish;

}

با دقت در این کلاس بهبود یافته، می بینیم که یک عضو داد های خصوصی از نوع کلاس

درون اعضای آن وجود دارد. همچنین دو تابع عضو عمومی جدید Date

نیز به این کلاس افزوده شده. به بدنۀ این دو تابع نگاه showDOP() و setDOP()

در بدنۀ این دو تابع showDate() و setDate() کنید. دو تابع دیگر به نا مهای

هستند. Date قرار دارند. این دو تابع، عضو کلاس

است، می توانیم Date از نوع publish چون

را برای آن صدا بزنیم. Date توابع عضو کلاس

را در فایل Date توجه کنید که تعاریف کلاس

گذاشته ایم و برای "Date.h" جداگانه ای به نام

فایل ،Book ترکیب کردن این کلاس با کلاس

را Book کرده ایم. کلاس include مذکور را

Date می توانیم به شکل مقابل مجسم کنیم. کلاس

به عنوان یک عضو داده ای در بخش اعضای داده ای

قرار گرفته است. Book کلاس

حالا می توانیم این کلاس مرکب را در برنامه استفاده کنیم:

int main()

{ Book reference("C++", 1, 450);

reference.setDOP(1384, 6, 15);

Book()

printName()

printId()

printPage()

setDOP()

showDOP()

name, author

id, page;

Date()

setDate()

getDate()

showDate()

year, month, day

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

فصل یازدهم / ترکیب و وراثت 361

cout << " reference id pages DOP " << endl;

cout << "---------------------------------------" << endl;

cout << " " ; reference.printName();

cout << " "; reference.printId();

cout << " " ; reference.printPage();

cout << " " ; reference.showDOP();

}

reference id pages DOP

---------------------------------------

C++ 1 450 1384/6/15

11 وراثت ‐3

وراثت روش دیگری برای ایجاد کلاس جدید از روی کلاس قبلی است. گاهی

نیز می گویند. اگر از قبل با برنام هنویسی مبتنی بر پنجر هها آشنایی « اشتقاق » به وراثت

را فراوان دیده اید. این موضوع « کلاس مشتق شده » مختصر داشته باشید، احتمالا عبارت

به خوبی اهمیت وراثت را آشکار می نماید.

در دنیای واقعی، وراثت به این معناست که هر فرزندی خواص عمومی را از والد

خود به ارث می گیرد، مثل رنگ چشم یا رنگ مو یا چهرۀ ظاهری یا رفتارهای غریزی

و ... . در دنیای نرم افزار نیز وراثت به همین معناست. یعنی کلاس جدید را طوری

قبلا تعریف x تعریف کنیم که اعضای کلاس دیگر را به کار بگیرد. فرض کنید کلاس

به شکل زیر است: x از کلاس y شده و وجود دارد. نحو کلی برای اشتقاق کلاس

class Y : public X

{

// ...

};

public مشتق شده است. عبارت x از کلاس y در این حالت می گوییم که کلاس

فقط به اعضای عمومی y بعد از علامت کولن برای تاکید بر این معناست که کلاس

« کلاس پایه » یا « کلاس والد 2 » کلاس اصلی 1 یا x دسترسی دارد. به کلاس x کلاس

می گوییم. « کلاس مشتق شده » یا « کلاس فرزند 4 » زیرکلاس 3 یا y می گوییم و به کلاس

1 – Base class 2 – Parent class

3 – Sub class 4 – Child class

 

 

362 برنامه سازی پیشرفته

کلاس فرزند می تواند علاوه بر اعضای به ارث برده شده، اعضای عمومی و خصوصی

خاص خود را نیز داشته باشد. به کد زیر دقت کنید:

class X

{ public:

int a;

private:

int b;

};

class Y : public X

{ public:

int c;

private:

int d;

}

به Y دارد. کلاس b و یک عضو خصوصی به نام a یک عضو عمومی به نام X کلاس

را به ارث می برد. یعنی x اعلان شده. پس عضو عمومی کلاس X عنوان فرزند کلاس

هم c هست. همچنین یک عضو عمومی مخصوص به خود به نام a دارای Y کلاس

است، نمی تواند توسط کلاس X یک عضو خصوصی از کلاس والد یعنی b دارد. چون

مستقیما دستیابی شود. Y فرزند یعنی

فقط یک عضو خصوصی Y بنابراین کلاس

را می توان Y و X دارد. کلاس های d به نام

به شکل مقابل تصور نمود. تصویر نشان

را هم دارد ولی b عضو Y می دهد که کلاس

اجازۀ دسترسی مستقیم به آن را ندارد. به مثال زیر توجه کنید.

Book از کلاس Ebook 11 مشتق کردن کلاس ‐ * مثال 4

می خواهیم کلاسی برای نگهداری مشخصات کتا بهای الکترونیکی بسازیم.

کتاب های الکترونیکی زیرمجموعه ای از کتاب های کلی هستند. پس منطقی است به

که قبلا ایجاد Book را از ابتدا ایجاد کنیم، آن را از کلاس Ebook جای این که کلاس

Book کردیم، مشتق کنیم. در این صورت اغلب توابع و متغیرهای مورد نیاز از کلاس

int a

int b

int a

int c

int d

int b

X Y

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

فصل یازدهم / ترکیب و وراثت 363

به ارث گرفته می شوند و نیازی به ایجاد آ نها نیست. فقط کافی است توابع و داده های

را به کلاس مشتق شده اضافه کنیم: Ebook خاص کلاس

#include "Book.h"

class Ebook : public Book

{ public:

Ebook(char* n, int i=0, int p=0) :

Book(n,i,p), format("PDF"), size(0) {}

void printFormat() { cout << format; }

void setSize(int s){ size = s; }

void setFormat(char* f) { format = f; }

void printSize() { cout << size; }

private:

string format;

int size;

}

int main()

{ Ebook reference("C++", 1, 450);

reference.setSize(5500);

cout << " Ebook id pages format size(KB) \n";

cout << "----------------------------------------- \n";

cout << " " ; reference.printName();

cout << " "; reference.printId();

cout << " "; reference.printPage();

cout << " "; reference.printFormat();

cout << " "; reference.printSize();

}

Ebook id pages format size(KB)

-----------------------------------------

C++ 1 450 PDF 5500

در کلاس printPage() و printId() و printName() گرچه توابع

مشتق شده، Book اعلان و تعریف نشده اند، اما چون این کلاس از کلاس Ebook

همۀ اعضای عمومی آن را به ارث می گیرد و دیگر نیازی به اعلان آن ها نیست. این مثال

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

364 برنامه سازی پیشرفته

نشان می دهد که با استفاده از اعضای عمومی به ارث گرفته شده از کلاس والد، می توان

به اعضای خصوصی آن دسترسی داشت. دقت کنید که چگونه در تابع سازندۀ کلاس

استفاده کرده و به اعضای خصوصی کلاس Book از تابع سازندۀ کلاس Ebook

دستیابی نموده ایم. Book

11 اعضای حفاظت شده ‐4

در مثال قبل نمی تواند مستقیما به اعضای خصوصی Ebook گرچه کلاس

کلاس والدش دسترسی داشته باشد، اما با استفاده از توابع عضو عمومی که از کلاس

والد به ارث برده، می تواند به اعضای خصوصی آن کلاس دستیابی کند. این محدودیت

بزرگی محسوب م یشود. اگر توابع عضو عمومی کلاس والد انتظارات کلاس فرزند را

برآورده نسازند، کلاس فرزند ناکارآمد می شود. اوضاع زمانی وخیم تر می شود که هیچ

تابع عمومی برای دسترسی به یک دادۀ خصوصی در کلاس والد وجود نداشته باشد.

داریم که author 11 یک دادۀ خصوصی به نام ‐ مثال 2 Book در کلاس

به هیچ ترتیبی نمی توانیم به این Ebook بیان گر نام نویسنده است. در کلاس فرزند

Ebook عضو دسترسی پیدا کنیم. می توانیم این دادۀ عضو را به شکل صریح در کلاس

است و Book زیرمجموعه ای از Ebook بگنجانیم ولی این کار منطقی نیست زیرا

توصیه می کند به جای C++ باید بتواند خواص آن را به کار بگیرد. در چنین مواقعی

اعلان کنیم، آن (private) را در کلاس والد به صورت خصوصی author این که

یا protected اعلان نماییم. اعضای (protected) را به شکل حفاظت شده

حفاظت شده 1 اعضایی هستند که مثل اعضای خصوصی از خارج کلاس قابل دستیابی

نیستند ولی مثل اعضای عمومی می توانند توسط کلا سهای فرزند مستقیما دستیابی

شوند. به مثال زیر توجه کنید.

protected با اعضای داده ای Book 11 کلاس ‐ * مثال 5

11 هستند با این تفاوت که اعضای ‐ کدهای زیر همان کدهای مثال 2

تبدیل شد هاند و توابع دستیابی protected به اعضای Book کلاس private

1 – Protected members

فصل یازدهم / ترکیب و وراثت 365

افزوده شده: Ebook به کلاس مشتق شدۀ printAuthor() و setAuthor()

class Book

{ public:

Book(char* n = " ", int i = 0, int p = 0) :

name(n), id(i), page(p) { }

void printName() { cout << name; }

void printId() { cout << id; }

void printPage() { cout << page; }

protected:

string name, author;

int id, page;

}

class Ebook : public Book

{ public:

Ebook(char* n, int i=0, int p=0) :

Book(n,i,p), format("PDF"), size(0) {}

void setAuthor(char* a) { author = a; }

void setSize(int s){ size = s; }

void setFormat(char* f) { format = f; }

void printAuthor() { cout << author; }

void printFormat() { cout << format; }

void printSize() { cout << size; }

protected:

string format;

int size;

}

قابل دستیابی Ebook از درون زیرکلاس Book حالا همۀ اعضای حفاظت شدۀ کلاس

هستند:

int main()

{ Ebook reference("C++", 1, 450);

reference.setSize(5500);

reference.setAuthor("P.N.U");

cout << "\n Ebook name: "; reference.printName();

cout << "\n id: "; reference.printId();

366 برنامه سازی پیشرفته

cout << "\n pages: "; reference.printPage();

cout << "\n format: "; reference.printFormat();

cout << "\n size(KB): "; reference.printSize();

cout << "\n Author: "; reference.printAuthor();

}

Ebook name: C++

id: 1

pages: 450

format: PDF

size(KB): 5500

Author: P.N.U

بنابر آ نچه گفتیم، اعضای یک کلاس سه گروه هستند: اعضای عمومی یا

که از بیرون کلاس و از درون کلاس های فرزند مستقیما قابل دستیابی اند؛ public

که فقط از درون همان کلاس یا توابع دوست کلاس private اعضای خصوصی یا

که از بیرون protected می توان به آ نها دسترسی داشت؛ اعضای حفاظت شده یا

کلاس قابل دستیابی نیستند ولی از درون همان کلاس یا درون کلاس های فرزند یا

توابع دوست کلاس می توان مستقیما به آ نها دسترسی داشت. پس قالب کلی تعریف

یک کلاس به شکل زیر است:

class X

{ public:

// public members

protected:

// protected members

private:

// private members

};

در نظر داشته باشید که اعضای حفاظت شده از کلاس والد، در کلاس فرزند نیز به

منظور می شوند. protected عنوان اعضای

دارند، چه نیازی به protected ممکن است بپرسید با خواصی که اعضای

است؟ برای پاسخ به این سوال یادآوری می کنیم که از مزیت های private اعضای

مهم شی گرایی، مخفی سازی اطلاعات است. همیشه این طور نیست که بخواهیم همۀ

 

 

فصل یازدهم / ترکیب و وراثت 367

اعضای کلاس والد در کلاس فرزند به ارث گذاشته شوند. ممکن است در کلاس

بگذاریم که نوع کاغذ مصرفی در کتاب paperkind یک عضو داده ای با نام Book

اصلا بی معناست. Ebook را نشان می دهد. طبیعی است که چنین عضوی در کلاس

را به paperkind عضو داده ای Ebook بنابراین لازم نیست (و نباید) که کلاس

ارث بگیرد و این عضو باید از دسترس دور بماند. عقیدۀ کلی بر این است که هر عضو

اعلان کنید مگر این که احتمال بدهید آن عضو private داده ای کلاس را به شکل

ممکن است لازم باشد در کلاس فرزند به ارث گرفته شود. آنگاه چنین عضوی را به

اعلان نمایید. protected شکل

11 غلبه کردن بر وراثت ‐5

همۀ اعضای عمومی و حفاظت شدۀ Y باشد، آنگاه اشیای X زیر کلاسی از Y اگر

printName() تابع دستیابی Ebook را ارث می برند. مثلا تمامی اشیای X کلاس

« عضو موروثی » یک printName() را به ارث می برند. به تابع Book از کلاس

می گوییم. گاهی لازم است یک نسخۀ محلی از عضو موروثی داشته باشیم. یعنی کلاس

فرزند، عضوی هم نام با عضو موروثی داشته باشد که مخصوص به خودش باشد و

داشته باشد و p یک عضو عمومی به نام X ارثی نباشد. برای مثال فرض کنید کلاس

را خواهند p عضو موروثی Y باشد. در این حالت اشیای کلاس X زیر کلاس Y کلاس

به شکل صریح اعلان کنیم، Y در زیرکلاس p داشت. حال اگر یک عضو به همان نام

عضو » ، این عضو جدید، عضو موروثی هم نامش را مغلوب می کند. به این عضو جدید

غالب p به عضو y1.p ، باشد Y یک شی از کلاس y می گوییم. بنابراین اگر 1 « غالب

موروثی دسترسی داشت. p موروثی. البته هنوز هم می توان به p اشاره دارد نه به

موروثی دستیابی دارد. p به y1.X::p عبارت

هم می توان اعضای داده ای موروثی را مغلوب کرد و هم اعضای تابعی موروثی

باشد و در زیرکلاس f() دارای یک عضو تابعی عمومی به نام X را. یعنی اگر کلاس

به تابع غالب اشاره y1.f() را به شکل صریح اعلان کنیم، آنگاه f() نیز تابع Y

به تابع موروثی اشاره دارد. در برخی از مراجع به توابع غالب y1.X::f() دارد و

 

 

368 برنامه سازی پیشرفته

می نامند. ما در این کتاب هر dominate می گویند و داده های غالب را override

دو مفهوم را به عنوان اعضای غالب به کار می بریم. به مثال زیر نگاه کنید.

11 اعضای داده ای و تابعی غالب ‐ * مثال 6

class X

{ public:

void f() { cout << "Now X::f() is running\n"; }

int a;

};

class Y : public X

{ public:

void f() { cout << "Now Y::f() is running\n"; }

// this f() overrides X::f()

int a;

// this a dominates X::a

};

را دارند. به همین دلیل تابع X همان مشخصات اعضای کلاس Y اعضای زیرکلاس

را مغلوب می کند (X::f()) موروثی f() اعلان شده، تابع Y که در زیرکلاس f()

را مغلوب (X::a) موروثی a اعلان شده نیز عضو Y که در زیرکلاس a و عضو

می نماید. برنامۀ آزمون زیر این مطلب را تایید می کند:

int main()

{ X x1;

x1.a = 22;

x1.f();

cout << "x1.a = " << x1.a << endl;

Y y1;

y1.a = 44; // assigns 44 to the a defined in Y

y1.X::a = 66; // assigns 66 to the a defined in X

y1.f(); // calls the f() defined in Y

y1.X::f(); // calls the f() defined in X

cout << "y1.a = " << y1.a << endl;

cout << " y1.X::a = " << y1.X::a << endl;

 

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

 

فصل یازدهم / ترکیب و وراثت 369

X x2 = Y1;

cout << "x2.a = " << x2.a << endl;

}

X::f() is running

x1.a = 22

Y::f() is running

X::f() is running

y1.a = 44

y1.X::a = 66

x2.a = 66

دارد. به f() و دو عضو تابعی مجزای a دو عضو داده ای مجزای y می بینید که شیء 1

طور پیش فرض، آن هایی که غالب هستند دستیابی می شوند ولی با استفاده از عملگر

جداسازی حوزه :: می توان به اعضای موروثی نیز دسترسی داشت.

شیئی از کلاس x نکتۀ مهمی وجود دارد. 2 x2 = y در دستور جایگزینی ; 1

شیئی از کلاس فرزند. وقتی قرار باشد یک شی از کلاس فرزند درون y والد است و 1

یک شی از کلاس والد کپی شود، به طور پیش فرض اعضای موروثی کلاس فرزند برای

در y1.X::a جایگزینی انتخاب می شوند نه اعضای غالب. یعنی در چنین حالتی

سعی کنید علت را توضیح دهید) ) . y1.a کپی می شود نه x2.a

در برنام ههای واقعی، از توابع غالب بسیار استفاده می شود اما استفاده از داد ههای

غالب چندان مرسوم نیست. اغلب این طور است که نوع یک عضو داد های در کلاس

a فرزند با نوع همان عضو در کلاس والد متفاوت است. برای مثال اگر عضو داده ای

در کلاس فرزند از نوع a باشد، آنگاه عضو داده ای صریح int در کلاس والد از نوع

اعلان می شود. double

سازنده های پیش فرض و نابودگرها در وراثت رفتار متفاوتی دارند. به این

صورت که سازندۀ کلاس فرزند قبل از اجرای خودش، سازندۀ کلاس والدش را فرا

می خواند. نابودگر کلاس فرزند نیز پس از اجرای خودش، نابودگر کلاس والدش را

فراخوانی می کند. به مثال زیر توجه نمایید.

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

 

370 برنامه سازی پیشرفته

11 سازنده ها و نابودکننده های والد ‐ * مثال 7

class X

{ public:

X() { cout << "X::X() constructor executing\n"; }

~X() { cout << "X::X() destructor executing\n"; }

};

clas Y : public X

{ public:

Y() { cout << "Y::Y() constructor executing\n"; }

~Y() { cout << "Y::Y() destructor executing\n"; }

};

clas Z : public Y

{ public:

Z(int n) {cout << "Z::Z(int) constructor executing\n";}

~Z() { cout << "Z::Z() destructor executing\n"; }

};

int main()

{ Z z(44);

}

X::X() constructor executing

Y::Y() constructor executing

Z::Z(int) constructor executing

Z::Z() destructor executing

Y::Y() destructor executing

X::X() destructor executing

می باشد. در X فرزند کلاس Y است که خود Y فرزند کلاس Z در برنامۀ بالا کلاس

نمونه سازی شده. پس انتظار این است Z یک شی از نوع کلاس main() بدنۀ تابع

فراخوانی شود. اما تصویر خروجی نیز نشان می دهد که قبل از Z که سازندۀ کلاس

فراخوانی Y تابع سازندۀ کلاس والدش یعنی سازندۀ کلاس ،Z فراخوانی سازندۀ

سازندۀ کلاس ،Y است، پس قبل از فراخوانی سازندۀ کلاس X فرزند Y می شود. چون

و X ابتدا سازندۀ کلاس Z فراخوانی می شود. لذا هنگام ایجاد یک شی از کلاس X

فراخوانی می شود. Z و در نهایت سازندۀ کلاس Y سپس سازندۀ کلاس

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

فصل یازدهم / ترکیب و وراثت 371

به پایان عمرش می رسد. پس باید Z برسیم، شیء main() وقتی به پایان تابع

فراخوانی شود. همین اتفاق هم می افتد اما پس از فراخوانی نابودگر Z نابودگر کلاس

هم فراخوانی می شود. پس از فراخوانی Y نابودگر کلاس والدش یعنی ،Z کلاس

است فراخوانی می شود. دقت کنید Y نیز که والد X نابودگر کلاس ،Y نابودگر کلاس

که سازنده های والد از برترین کلاس به زیرترین کلاس اجرا می شوند ولی نابودگرها از

زیرترین کلاس به سمت برترین کلاس اجرا می شوند. اما چرا چنین اتفاقی می افتد؟

را به ارث می گیرد. سازندۀ X باشد، اعضای کلاس X فرزند کلاس Y اگر کلاس

راجع به اعضای صریح این کلاس آگاهی دارد ولی از اعضای کلاس والد Y کلاس

چه میزان Y چیزی نمی داند. بنابراین هنگام اجرا می داند برای اعضای صریح کلاس

حافظه منظور کند اما نمی داند برای اعضای موروثی چقدر حافظه نیاز است. از کجا

می توان میزان حافظۀ مورد نیاز اعضای موروثی را فهمید؟ از سازندۀ والد. به همین

دلیل است که هر سازنده قبل از اجرای خودش، سازندۀ والدش را فرا می خواند.

سازندۀ والد حافظۀ مورد نیاز برای اعضای والد را تخصیص داده و این حافظه را به

سازندۀ فرزند تحویل می دهد. سازندۀ فرزند نیز حافظۀ لازم برای اعضای صریح را

تخصیص داده و به میزان قبلی می افزاید و به این ترتیب شیء فرزند با حافظۀ کافی

متولد می شود. هنگام نابود کردن شیء فرزند نیز ابتدا نابودگر کلاس فرزند حافظۀ

تخصیصی به اعضای صریح را آزاد می کند اما حافظۀ تخصیص یافته به اعضای موروثی

بلاتکلیف باقی می مانند. به همین دلیل لازم است نابودکنندۀ کلاس والد نیز فراخوانی

شود تا این حافظۀ اضافی آزاد شود.

11 اشاره گرها در وراثت ‐6

اشاره گری از p در شی گرایی خاصیت جالبی وجود دارد و آن این است که اگر

را می توان به هر فرزندی از آن کلاس نیز اشاره داد. به p نوع کلاس والد باشد، آنگاه

کد زیر نگاه کنید:

class X

{ public:

void f();

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

372 برنامه سازی پیشرفته

}

class Y : public X // Y is a subclass of X

{ public:

void f();

}

int main()

{ X* p; // p is a pointer to objects of base class X

Y y;

p = &y; // p can also point to objects of subclass Y

}

است نیز X که فرزند Y است، اما آن را می توان به اشیای کلاس X* از نوع p گرچه

است. حالا در کد فوق *p.f() معادل p->f() اشاره داد. یادآوری می کنیم که

فراخوانی p->f() اشاره کند و Y است به یک شیء X* که از نوع p تصور کنید

انتظار داریم که ؟ Y::f() یا X::f() ؟ فراخوانی می شود f() شود. اکنون کدام

تعریف شده است و فقط X* از نوع p . فراخوانی شود ولی چنین نیست Y::f()

به چه شیئی اشاره دارد. مهم این است p را می شناسد. اصلا مهم نیست که X::f()

است و توابع آن را می شناسد. مثال زیر این مطلب را تایید می کند. X* که از کلاس

11 اشاره گری از کلاس والد به شیئی از کلاس فرزند ‐ * مثال 8

است. هر دوی این کلاس ها دارای یک X زیرکلاسی از Y در برنامۀ زیر، کلاس

تعریف شده: X* اشاره گری از نوع p هستند و f() عضو تابعی به نام

class X

{ public:

void f() { cout << "X::f() executing\n"; }

};

class Y : public X

{ public:

void f() { cout << "Y::f() executing\n"; }

}

int main()

{ X x; فصل یازدهم / ترکیب و وراثت 373

X* p = &x;

p->f(); // invokes X::f() because p has type X*

p = &y;

p->f(); // invokes X::f() because p has type X*

}

X::f() executing

X::f() executing

و یک X از کلاس x فراخوانی شده. یک بار برای شیء p->f() در برنامۀ بالا دو بار

به اشیای p ولی در هر دو بار بدون توجه به این که Y از کلاس y بار هم برای شیء

فراخوانی شده. X::f() چه کلاسی اشاره دارد، فقط

مشخص است که اثر فوق مطلوب به نظر نمی رسد. انتظار داریم که برای اشیای

هم هنگام X فراخوانی شود و برای اشیای Y::f() تابع p->f() هنگام اجرای ،Y

توابع » فرا خوانده شود. برای برآوردن این انتظار، از X::f() تابع p->f() اجرای

استفاده می کنیم. « مجازی

11 توابع مجازی و چندریختی ‐7

مشخص می شود. وقتی virtual تابع مجازی 1 تابعی است که با کلمۀ کلیدی

یک تابع به شکل مجازی اعلان می شود، یعنی در حداقل یکی از کلاس های فرزند نیز

تابعی با همین نام وجود دارد. توابع مجازی امکان می دهند که هنگام استفاده از

اشاره گرها، بتوانیم بدون در نظر گرفتن نوع اشاره گر، به توابع شیء جاری دستیابی

کنیم. به مثال زیر دقت کنید.

11 استفاده از توابع مجازی ‐ * مثال 9

از کلاس f() 11 است با این تفاوت که تابع ‐ این برنامه، همان برنامۀ مثال 8

والد به شکل یک تابع مجازی اعلان شده است:

class X

{ public:

virtual void f() { cout << "X::f() executing\n"; }

1 – Virtual function

 

Y y;

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

374 برنامه سازی پیشرفته

};

class Y : public X

{ public:

void f() { cout << "Y::f() executing\n"; }

}

int main()

{ X x;

Y y;

X* p = &x;

p->f(); // invokes X::f()

p = &y;

p->f(); // invokes Y::f()

}

X::f() executing

Y::f() executing

X::f() ، فراخوانی شود p->f() اشاره کند و تابع X به شیئی از نوع p اکنون وقتی

فراخوانی شود، p->f() اشاره کند و تابع Y به شیئی از نوع p اجرا می شود و وقتی

یا چندریختی می گویند « چندشکلی » ، اجرا می شود. به این مفهوم Y::f() این دفعه

به چه نوع شیئی اشاره کند، نتایج متفاوتی p بسته به این که p->f() زیرا فراخوانی

تولید می کند. دقت داشته باشید که فقط توابع کلاس والد را به شکل مجازی تعریف

می کنند. مثال زیر، نمونۀ مفیدتری از چندریختی را نشان می دهد.

11 چندریختی از طریق توابع مجازی ‐ * مثال 10

سه کلاس زیر را در نظر بگیرید. بدون استفاده از تواب عمجازی، برنامه آن طور که

مورد انتظار است کار نمی کند:

class Book

{ public:

Book(char* s) { name = new char[strlen(s+1)];

strcpy(name, s);

}

void print() { cout << "Here is a book with name "

 

 

فصل یازدهم / ترکیب و وراثت 375

<< name << ".\n";

}

protected:

char* name;

};

class Ebook : public Book

{ public:

Ebook(char* s, float g) : Book(s), size(g) {}

void print() { cout << "Here is an Ebook with name "

<< name << " and size "

<< size << " MB.\n";

}

private:

float size;

}

class Notebook : public Book

{ public:

Notebook(char* s, int n) : Book(s) , pages(n) {}

void print() { cout << "Here is a Notebook with name "

<< name << " and " << pages

<< " pages.\n";

}

private:

int pages;

};

int main()

{ Book* b;

Book mybook("C++");

b = &mybook;

b->print();

Ebook myebook("C#", 5.16);

b = &myebook;

b->print();

Notebook mynotebook(".NET", 230);

b = &mynotebook;

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

376 برنامه سازی پیشرفته

b->print();

}

Here is a book with name C++.

Here is a book with name C#.

Here is a book with name .NET.

یک کلاس والد است که دارای دو فرزند به نام های Book در برنامۀ بالا کلاس

هستند. print() می باشد. هر سۀ این کلا سها دارای تابع Notebook و Ebook

تعریف شده، پس می توان آن را به اشیایی Book* از نوع کلاس والد یعنی b اشاره گر

از کلاس های فرزند نیز اشاره داد اما هر دفعه هنگام فراخوانی

اجرا می شود. Book از کلاس print() فقط تابع b->print()

در کلاس والد را به شکل مجازی اعلان می کنیم: print() حالا تابع

class Book

{ public:

Book(char* s) { name = new char[strlen(s+1)];

strcpy(name, s);

}

virtual void print() { cout << "Here is a book with

name " << name << ".\n";

}

protected:

char* name;

};

اکنون که با این تغییر، دوباره برنامه را اجرا کنیم، همه چیز به درستی طبق انتظار ما

پیش می رود:

Here is a book with name C++.

Here is an Ebook with name C# and size 5.16 MB.

Here is a Notebook with name .NET and pages 230.

به چه نوعی اشاره b چندریختی دارد و بسته به این که b->print() فراخوانی

داشته باشد، نتیجۀ متفاوتی خواهد داشت.

فصل یازدهم / ترکیب و وراثت 377

زمانی یک تابع را به شکل مجازی تعریف می کنند که احتمال بدهند حداقل یک

زیرکلاس، نسخه ای محلی از همان تابع را خواهد داشت.

11 نابودکنندۀ مجازی ‐8

با توجه به تعریف توابع مجازی، به نظر می رسد که نمی توان توابع سازنده و

نابودکننده را به شکل مجازی تعریف نمود زیرا سازنده ها و نابودگرها در کلاس های

والد و فرزند، هم نام نیستند. در اصل، سازنده ها را نمی توان به شکل مجازی تعریف

کرد اما نابودگرها قصۀ دیگری دارند. مثال بعدی ایراد مهلکی را نشان می دهد که با

مجازی کردن نابودگر، برطرف می شود.

11 حافظۀ گم شده ‐ * مثال 11

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

به برنامۀ زیر دقت کنید:

 

class X

{ public:

x() { p = new int[2]; cout << "X(). "; }

~X() { delete [] p; cout << "~X().\n" }

private:

int* p;

};

class Y : public X

{ public:

Y() { q = new int[1023]; cout << "Y() : Y::q = " << q

<< ". "; }

~Y() { delete [] q; cout << "~Y(). "; }

private:

int* q;

};

int main()

{ for (int i=0; i<8; i++)

{ X* r = new Y;

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

378 برنامه سازی پیشرفته

delete r;

}

}

X(). Y() : Y::q = 0x5821c. ~X().

X(). Y() : Y::q = 0x5921c. ~X().

X(). Y() : Y::q = 0x5a21c. ~X().

X(). Y() : Y::q = 0x5b21c. ~X().

X(). Y() : Y::q = 0x5c21c. ~X().

X(). Y() : Y::q = 0x5d21c. ~X().

X(). Y() : Y::q = 0x5e21c. ~X().

X(). Y() : Y::q = 0x5f21c. ~X().

یک شیء پویای جدید ساخته می شود. طبق انتظار، سازند هها for در هر تکرار حلقۀ

با این حساب برای هر . Y() و سپس X() از بالا به پایین اجرا می شوند یعنی ابتدا

و 4092 بایت برای X شی، 4100 بایت از حافظه تخصیص می یابد ( 8 بایت برای

را احضار X معرفی شده، فقط نابودگر X به عنوان اشار هگری به اشیای r اما چون .(Y

می کند و فقط 8 بایت را آزاد می سازد و 4092 بایت باقی مانده، بلاتکلیف می مانند.

پس در هر تکرار 3992 بایت از حافظه ناپدید می شود! خروجی نیز این را تایید

را به شکل مجازی معرفی کرده و برنامه ~X() می کند. برای رفع این اشکال، نابودگر

را دوباره اجرا می نماییم:

class X

{ public:

x() { p = new int[2]; cout << "X(). "; }

virtual ~X() { delete [] p; cout << "~X().\n" }

private:

int* p;

};

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

X(). Y() : Y::q = 0x5a220. ~Y(). ~X().

 

 

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

فصل یازدهم / ترکیب و وراثت 379

هر دو نابودگر فرا خوانده می شود و در نتیجه همۀ حافظۀ for حالا هر تکرار حلقۀ

استفاده شود. r تخصیص یافته آزاد می شود و این حافظه دوباره می تواند برای اشاره گر

مثال بالا، ایراد شکاف حافظه 1 را نشان می دهد. در یک نرم افزار بزرگ، این مساله

می تواند باعث بروز فاجعه شود. مخصوصا این که پیدا کردن ایراد فوق بسیار مشکل

است. پس بخاطر داشته باشید که هر وقت از اشیای پویا در برنامه استفاده م یکنید،

نابودگر کلاس والد را به شکل مجازی اعلان نمایید.

11 کلاس های پایۀ انتزاعی ‐9

در شی گرایی رسم بر این است که ساختار برنامه و کلا سها را طوری طراحی

کنند که بتوان آن ها را به شکل یک نمودار درختی شبیه زیر نشان داد:

استفاده کنیم. شی گرایی Html برای مثال ممکن است بخواهیم در یک برنامه از کلاس

را Ebook ، را اعلان کنیم و از آن کلاس Book توصیه دارد که ابتدا کلاس پایۀ

را مشتق نماییم. گرچه ممکن است Html نیز زیرکلاس Ebook مشتق 2 کرده و از

این روش در ابتدا بی معنی و حتی وقت گیر و غیرمنطقی به نظر برسد، اما در اصل

روش مذکور سبب سهولت در اصلاح و پشتیبانی برنامه می شود. این موضوع در

برنامه های تجاری، بسیار مهم و حیاتی است.

می دانیم که در ساختار فوق، هر کلاس دارای توابع خاصی است که رفتارهای

ویژۀ آن کلاس را نشان می دهد. ممکن است توابعی مجازی هم وجود داشته باشند که

در همۀ زیرکلاس ها مغلوب شوند و نسخه ای محلی از آن ها ایجاد شود. در این حالت

دیگر نیازی نیست که توابع مذکور در کلاس های پایه دارای بدنه باشند زیرا این بدنه

BOOK

Paper BOOK EBOOK

REFERENCE MAGAZINE COOKBOOK PDF CHM HLP HTML

1 – Memory leak 2 – Derrive

 

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

380 برنامه سازی پیشرفته

هرگز به کار گرفته نمی شود. در این گونه مواقع، تابع مذکور را به شکل یک تابع

مجازی خالص 1 اعلان می کنند. یک تابع مجازی خالص، تابعی است که هیچ

پیاده سازی ندارد و فاقد بدنه است. در این توابع به جای بدنه، عبارت ; 0= را قرار

وجود print() می دهند. برای مثال، در همۀ کلاس های رابطۀ فوق، تابعی به نام

دارد که هر زیرکلاس یک نسخۀ محلی از آن را دارد. پس لازم نیست که در کلاس

برای این تابع، بدنه ای تعریف کنیم. فقط کافی است دستور Book پایۀ

virtual void print()=0;

بگنجانیم. هر وقت چنین عبارتی در بدنۀ یک کلاس ظاهر شود، Book را در کلاس

به این معناست که تابع مذکور در این کلاس هرگز فراخوانی نمی شود و زیرکلاسی

وجود دارد که نسخۀ محلی از آن تابع را به کار خواهد گرفت. کلاسی که یک یا چند

تابع مجازی خالص داشته باشد را کلاس پایۀ انتزاعی 2 می نامیم (به آن کلاس پایۀ

مجرد نیز گفته می شود). کلاس های پایۀ مجرد فقط برای ساختن و اشتقاق زیرکلاس ها

به کار می روند و هیچ شیئی مستقیما از روی آن ها ساخته نمی شود. کلاسی که هیچ تابع

می گوییم. اشیای داخل یک « کلاس مشتق شدۀ واقعی » مجازی خالص نداشته باشد را

برنامه از روی کلاس های مشتق شدۀ واقعی ساخته می شوند.

اگر تابع مجازی خالص اصلا فراخوانی نمی شود، پس اصلا چرا آن را اعلان می کنیم؟

پاسخ این است که تابع مجازی خالص را اعلان می کنیم تا تاکید کنیم که دست کم یک

زیرکلاس باید نسخه ای محلی از این تابع را داشته باشد.

11 کلاس پایۀ انتزاعی و یک کلاس مشتق شدۀ واقعی ‐ * مثال 12

class VCR

{ public:

virtual void on() =0;

virtual void off() =0;

virtual void record() =0;

virtual void stop() =0;

virtual void play() =0;

};

1 – Pure virtual function 2 – Abstracted base class

 

 

فصل یازدهم / ترکیب و وراثت 381

class Video : public VCR

{ public:

void on();

void off();

void record();

void stop();

void play();

};

class Camera : public VCR

{ public:

void on();

void off();

void record();

void stop();

void play();

};

Camera و Video یک کلاس پایۀ انتزاعی است که کلاس VCR در کد بالا، کلاس

همگی به شکل یک تابع مجازی خالص VCR از آن مشتق می شود. توابع عضو کلاس

نیز اعلان شد هاند که Camera و Video اعلان شده اند. این توابع در زیرکلاس

نسخه های محلی و غالب را نشان می دهند.

مثال هایی که در این فصل و دو فصل قبل دیدید خیلی کاربردی نستند و فقط

برای آموزش مفاهیم شی گرایی بیان شده اند. حالا که با شی گرایی و مزایای آن آشنا

شده اید، وقت آن رسیده که برنامه نویسی شی گرا را با جدیت دنبال کنید و تلاش داشته

باشید که از این پس، برنامه هایی که می نویسید شی گرا باشند. ممکن است در شروع کار

با مشکلاتی مواحه شوید که با مرور مطالب ذکر شده خواهید توانست بر آن ها غلبه

کنید. هر چه بیشتر در شی گرایی تبحر پیدا کنید، برنامه های تجاری مطمئن ترین خواهید

نوشت و احتمال شکست در پروژ ههای گروهی که اجرا می کنید، کم تر می شود.

مسلم است که شی گرایی، رهیافت نهایی در جهان برنامه نویسی نیست و هر

چه زمان می گذرد، راهکارهای تازه ای در جهت آسان سازی برنامه نویسی پدید می آید

لیکن برنام هنویسان شی گرایی را به عنوان یک راهکار قابل اعتماد، پذیرفته اند.

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

382 برنامه سازی پیشرفته

پرسش های گزینه ای

کدام گزینه صحیح است؟ class X : public Y { } 1 – در کد

دارد Y عضوی از نوع کلاس X الف – کلاس

است Y والد کلاس X ب – کلاس

مشتق شده است X از کلاس Y ج – کلاس

دسترسی دارد Y به اعضای عمومی کلاس X د – کلاس

باشد، آنگاه: B فرزند کلاس A 2 – اگر کلاس

دسترسی دارد B به اعضای عمومی کلاس A الف – کلاس

دسترسی دارد A به اعضای عمومی کلاس B ب – کلاس

دسترسی دارد A به اعضای خصوصی کلاس B ج – کلاس

دسترسی دارد A به اعضای حفاظت شد ۀ کلاس B د – کلاس

دارای یک عضو B است. اگر کلاس B فرزند کلاس A 3 – فرض کنید کلاس

باشد آنگاه: m حفاظت شده به نام

را به شکل یک عضو خصوصی به ارث می گیرد m عضو A الف – کلاس

را به شکل یک عضو عمومی به ارث می گیرد m عضو A ب – کلاس

را به شکل یک عضو حفاظت شده به ارث می گیرد m عضو A ج – کلاس

را ندارد m اجازۀ دستیابی به عضو A د – کلاس

است و در هر دو کلاس، یک عضو عمومی B فرزند کلاس A 4 – فرض کنید کلاس

باشد، B یک شی از کلاس b و A یک شی از کلاس a اعلان شده. حال اگر x به نام

کدام گزینه صحیح است؟

عضو موروثی است a.B::x عضو غالب است و a.x – الف

عضو موروثی است b.A::x عضو غالب است و b.x – ب

عضو موروثی است a.x عضو غالب است و a.B::x – ج

عضو موروثی است b.x عضو غالب است و b.A::x – د

 

فصل یازدهم / ترکیب و وراثت 383

5 – عضو حفاظت شده عضوی است که:

الف – از خارج کلاس قابل دستیابی است

ب – فقط توسط اعضای همان کلاس قابل دستیابی است

ج – فقط توسط اعضای کلاس فرزند قابل دستیابی است

د – توسط اعضای همان کلاس و اعضای کلاس فرزند قابل دستیابی است

6 – کدام گزینه در وراثت صحیح نیست؟

الف – قبل از فراخوانی سازندۀ والد، سازندۀ فرزند فراخوانی می شود

ب – بعد از فراخوانی نابودکنندۀ فرزند، نابودکنندۀ والد فراخوانی می شود

ج – قبل از فراخوانی سازندۀ فرزند، سازندۀ والد فراخوانی می شود

د – فراخوانی سازندۀ والد ربطی به سازندۀ فرزند ندارد

7 – کدام گزینه در بارۀ چندریختی کلاس ها صحیح است؟

الف – چندریختی به وسیلۀ استفاده از توابع مجازی امکا نپذیر است

ب – چندریختی به وسیلۀ استفاده از اعضای حفاظت شده امکان پذیر است

ج – چندریختی به وسیلۀ استفاده از اشیای ثابت امکان پذیر است

د – چندریختی به وسیلۀ استفاده از توابع دستیابی امکان پذیر است

معادل کدام کد زیر است؟ p->f(); 8 – کد

p.f(); – ب *p.f(); ‐ الف

p.(*f)() – د (*p).f(); – ج

9 – کدام گزینه صحیح است؟

الف – تابع سازنده را می توان در کلاس والد به شکل مجازی تعریف کرد ولی

نابودکننده را نمی توان

ب – تابع نابودکننده را می توان در کلاس والد به شکل مجازی تعریف کرد ولی

سازنده را نمی توان

ج – هر دو تابع سازنده و نابودکننده را می توان در کلاس والد به شکل مجازی تعریف کرد

د – هیچ یک از دو تابع سازنده و نابودکننده را نمی توان در کلاس والد به شکل

مجازی تعریف کرد.

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

384 برنامه سازی پیشرفته

10 – تابع مجازی خالص تابعی است که :

الف – هیچ پیاده سازی ندارد و تعریف آن فاقد بدنه است

ب – نمی تواند توسط کلاس فرزند به ارث گرفته شود

ج – عضو هیچ کلاسی نیست

است void د – هیچ پارامتری ندارد و نوع بازگشتی آن

11 – وقتی در تعریف یک کلاس از تابع مجازی خالص استفاده شود، آنگاه:

الف – آن کلاس حداقل یک فرزند دارد

ب – در یک فرزند آن کلاس، تابع مذکور یک نسخۀ محلی دارد

ج – تابع مذکور توسط اشیای آن کلاس هرگز فراخوانی نمی شود

د – هر سه مورد

12 – اگر کلاسی یک کلاس پایۀ مجرد باشد آنگاه:

الف – آن کلاس هیچ تابع مجازی خالص ندارد

ب – آن کلاس یک یا چند تابع مجازی خالص دارد

ج – آن کلاس برای اشتقاق زیرکلاس ها به کار می رود

د – گزینۀ ب و ج صحیح است.

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

فصل یازدهم / ترکیب و وراثت 385

پرسش های تشریحی

1‐ ترکیب چه تفاوتی با وراثت دارد ؟

دارند ؟ private چه تفاوتی با اعضای protected 2‐ اعضای

3‐ رفتار سازندۀ پیش فرض و نابودکننده در وراثت چگونه است؟

مجازی ) چیست ؟ ) virtual 4‐ تابع عضو

5‐ تابع عضو مجازی خالص چیست ؟

6‐ شکاف حافظه چگونه ایجاد می شود و برای جلوگیری از آن چه باید کرد ؟

8‐ کلاس پایۀ انتزاعی چیست و چرا ساخته می شود؟

9‐ کلاس مشتق شدۀ واقعی چیست؟

10 ‐ بسته بندی ایستا و بسته بندی پویا چه تفاوتی با هم دارد؟

12 ‐ چندریختی چیست و چگونه سبب توسعۀ کلاس می شود؟

13 ‐ چه خطایی در تعاریف زیر اس ت؟

class X

{ protected:

int a;

};

class Y : public X

{ public:

void set(X x, int c) { x.a = c; }

};

 

386 برنامه سازی پیشرفته

تمرین های برنامه نویسی

1‐ سلسله مراتب کلاس زیر را پیاده سازی کنید:

که اشیای آن شبیه شکل زیر هستند را تعریف و آزمایش کنید. سپس Name 2‐ کلاس

ایجاد کنید که مشخصات Person کلاسی به نام

افراد شامل نام، تاریخ تولد، سن و مدرک تحصیلی

را طوری Person را نگهداری کند. کلاس

تعریف کنید که برای نگهداری نام به جای نوع

استفاده کند: Name از نوع string

که اشیای آن شبیه شکل زیر هستند را تعریف و آزمایش کنید. Address 3‐ کلاس

در تمرین قبلی، آن Person به کلاس address سپس با افزودن یک عضو داده ای

را بهبود دهید.

shape

TwoDimentional ThreeDimentional

Triangle Rectangle Circle Box Cone Cylinderr Sphere

last Kaveh

first Mahmoud

nick Tehrani

name

state Tehran

country IRAN

city Tehran

address

street Azadi

 

« الف » ضمیمۀ

پاسخ نامۀ پرسش های گزینه ای

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل اول فصل دوم

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل سوم

 

 

 

388 برنامه سازی پیشرفته

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل

چهارم

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل

پنجم

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل ششم

 

ضمیمۀ الف / پاسخ نامۀ پرسش های گزینه ای 389

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل

هفتم

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل هشتم فصلم

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

 

390 برنامه سازی پیشرفته

فصل دهم

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

فصل

یازدهم

د ج ب

الف

1

2

3

4

5

6

7

8

9

10

 

« ب » ضمیمه

جدول اسکی

هر کاراکتر به صورت یک کد صحیح در حافظه ذخیره می شود. این کد، عددی

در محدودۀ صفر تا 127 است. به جدولی که تمام 128 کاراکتر موجود در این

می گویند. ASCII محدوده را با یک ترتیب از پیش مشخص نشان می دهد، جدول

شرح این جدول در ادامه آمده است. توجه کنید که 32 کاراکتر اول کاراکترهای

چاپ نشدنی هستند. لذا به جای نشان دادن سمبل آن ها در ستون اول، زنجیر ۀ کنترلی

آن ها یا زنجیرۀ خروجی آن ها نشان داده شده است. زنجیرۀ کنترلی یک کاراکتر غیر

با کلید دیگری است که این دو باهم فشار داده می شوند Ctrl چاپی، ترکیبی از کلید

تا کاراکتر مورد نظر وارد شود. برای مثال، کاراکتر پایان فایل (با کد اسکی 4) با زنجیرۀ

وارد می شود. زنجیرۀ خروجی یک کاراکتر غیر چاپی، ترکیبی است از Ctrl+D

C++ کاراکتر بک اسلش \ (که کاراکتر کنترل نامیده شده) و یک حرف که در کد منبع

تایپ می شود تا آن کاراکتر را مشخص کند. برای مثال کاراکتر خط جدید (با کد اسکی

نوشته می شود. \n به صورت C++ 10 ) در برنامۀ

کاراکتر شرح مبنای ده مبنای هشت مبنای شانزده

0x0 000 خالی – پایان رشته 0 Ctrl+@

0x1 001 شروع سرآیند 1 Ctrl+A

0x2 002 شروع متن 2 Ctrl+B

0x3 003 پایان متن 3 Ctrl+C

0x4 004 پایان انتقال – پایان فایل 4 Ctrl+D

0x5 005 رهایی، بیرون رفتن 5 Ctrl+E

 

392 برنامه سازی پیشرفته

کاراکتر شرح مبنای ده مبنای هشت مبنای شانزده

0x6 006 تصدیق 6 Ctrl+F

0x7 007 زنگ، بوق سیستم 7 \a

0x8 010 پسخور 8 \b

0x9 011 جدول افقی 9 \t

0xa 012 تغذیه خط، خط جدید 10 \n

0xb 013 جدول عمودی 11 \v

0xc 014 تغذیه فرم، صفحه جدید 12 \f

0xd 015 برگشت نورد 13 \r

0xe 016 شیفت(جابجایی) بیرون 14 Ctrl+N

0xf 017 شیفت داخل 15 Ctrl+O

0x10 020 پیوند داده 16 Ctrl+P

0x11 021 وسیلۀ کنترلی 1، پیمایش مجدد 17 Ctrl+Q

0x12 022 18 وسیلۀ کنترلی 2 Ctrl+R

0x13 023 وسیلۀ کنترلی 3، توقف پیمایش 19 Ctrl+S

0x14 024 20 وسیلۀ کنترلی 4 Ctrl+T

0x15 025 تصدیق منفی 21 Ctrl+U

0x16 026 بی کار کردن رخداد هم زمان 22 Ctrl+V

0x17 027 پایان بلوک انتقال 23 Ctrl+W

0x18 030 لغو 24 Ctrl+X

0x19 031 پایان پیام، وقفه 25 Ctrl+Y

0x1a 032 جانشینی، خروج 26 Ctrl+Z

0x1b 033 بیرون رفتن، رهایی 27 Ctrl+[

0x1c 034 جداساز فایل 28 Ctrl+/

0x1d 035 جداساز گروه 29 Ctrl+]

0x1e 036 جداساز رکورد 30 Ctrl+^

0x1f 037 جداساز واحد 31 Ctrl+_

 

 

ضمیمۀ ب / جدول اسکی 393

کاراکتر شرح مبنای ده مبنای هشت مبنای شانزده

0x20 040 جای خالی 32

0x21 041 ! علامت تعجب 33

0x22 042 " علامت نقل قول 34

0x23 043 # علامت شماره 35

0x24 044 $ علامت دلار 36

0x25 045 % علامت درصد 37

0x26 046 38 and & علامت

0x27 047 ' نقل قول تنها، آپستروف 39

0x28 050 ) پرانتز چپ 40

0x29 051 ( پرانتز راست 41

0x2a 052 * ضربدر، ستاره 42

0x2b 053 + بعلاوه 43

0x2c 054 , کاما، ویرگول 44

0x2d 055 - تفریق 45

0x2e 056 . نقطه، نقطه اعشار 46

0x2f 057 / اسلش 47

0x30 060 0 رقم صفر 48

0x31 061 1 رقم یک 49

0x32 062 2 رقم دو 50

0x33 063 3 رقم سه 51

0x34 064 4 رقم چهار 52

0x35 065 5 رقم پنج 53

0x36 066 6 رقم شش 54

0x37 067 7 رقم هفت 55

0x38 070 8 رقم هشت 56

0x39 071 9 رقم نه 57

394 برنامه سازی پیشرفته

کاراکتر شرح مبنای ده مبنای هشت مبنای شانزده

0x3a 072 : کولن 58

0x3b 073 ; سمیکولن 59

0x3c 074 > کوچک تر 60

0x3d 075 = مساوی 61

0x3e 076 < بزرگ تر 62

0x3f 077 ? علامت سوال 63

0x40 0100 @ علامت تجاری 64

0x41 0101 بزرگ 65 A حرف A

0x42 0102 بزرگ 66 B حرف B

0x43 0103 بزرگ 67 C حرف C

0x44 0104 بزرگ 68 D حرف D

0x45 0105 بزرگ 69 E حرف E

0x46 0106 بزرگ 70 F حرف F

0x47 0107 بزرگ 71 G حرف G

0x48 0110 بزرگ 72 H حرف H

0x49 0111 بزرگ 73 I حرف I

0x4a 0112 بزرگ 74 J حرف J

0x4b 0113 بزرگ 75 K حرف K

0x4c 0114 بزرگ 76 L حرف L

0x4d 0115 بزرگ 77 M حرف M

0x4e 0116 بزرگ 78 N حرف N

0x4f 0117 بزرگ 79 O حرف O

0x50 0120 بزرگ 80 P حرف P

0x51 0121 بزرگ 81 Q حرف Q

0x52 0122 بزرگ 82 R حرف R

0x53 0123 بزرگ 83 S حرف S

 

ضمیمۀ ب / جدول اسکی 395

کاراکتر شرح مبنای ده مبنای هشت مبنای شانزده

0x54 0124 بزرگ 84 T حرف T

0x55 0125 بزرگ 85 U حرف U

0x56 0126 بزرگ 86 V حرف V

0x57 0127 بزرگ 87 W حرف W

0x58 0130 بزرگ 88 X حرف X

0x59 0131 بزرگ 89 Y حرف Y

0x5a 0132 بزرگ 90 Z حرف Z

0x5b 0133 ] براکت چپ 91

0x5c 0134 \ بک اسلش 92

0x5d 0135 [ براکت راست 93

0x5e 0136 ^ توان 94

0x5f 0137 _ خط زیرین 95

0x60 0140 ` علامت تاکید هجا 96

0x61 0141 کوچک 97 A حرف a

0x62 0142 کوچک 98 B حرف b

0x63 0143 کوچک 99 C حرف c

0x64 0144 کوچک 100 D حرف d

0x65 0145 کوچک 101 E حرف e

0x66 0146 کوچک 102 F حرف f

0x67 0147 کوچک 103 G حرف g

0x68 0150 کوچک 104 H حرف h

0x69 0151 کوچک 105 I حرف i

0x6a 0152 کوچک 106 J حرف j

0x6b 0153 کوچک 107 K حرف k

0x6c 0154 کوچک 108 L حرف l

0x6d 0155 کوچک 109 M حرف m

 

 

396 برنامه سازی پیشرفته

کاراکتر شرح مبنای ده مبنای هشت مبنای شانزده

0x6e 0156 کوچک 110 N حرف n

0x6f 0157 کوچک 111 O حرف o

0x70 0160 کوچک 112 P حرف p

0x71 0161 کوچک 113 Q حرف q

0x72 0162 کوچک 114 R حرف r

0x73 0163 کوچک 115 S حرف s

0x74 0164 کوچک 116 T حرف t

0x75 0165 کوچک 117 U حرف u

0x76 0166 کوچک 118 V حرف v

0x77 0167 کوچک 119 W حرف w

0x78 0170 کوچک 120 X حرف x

0x79 0171 کوچک 121 Y حرف y

0x7a 0172 کوچک 122 Z حرف z

0x7b 0173 } آکولاد (ابرو) چپ 123

0x7c 0174 | خط لوله 124

0x7d 0175 { آکولاد (ابرو) راست 125

0x7e 0176 ~ علامت نقیض 126

0x7f 0177 حذف، پاک کردن 127 Delete

« ج » ضمیمه

C++ کلمات کلیدی

default

continue

const_cast

const

compl

class

char

catch

case

break

bool

bitor

bitand

auto

asm

and_eq

and

کلمه کلیدی

switch در عبارت « وگر نه » حالت

در حلقه به ابتدای دور بعدی پرش می کند

برای تغییر دادن اشیا از درون تابع عضو تغییرناپذیر استفاده می شود

تعریف یک ثابت را مشخص می کند

بیتی : ~ NOT مترادفی برای عملگر منطقی

تعریف یک کلاس را مشخص می کند

معرف نوع صحیح

فعالیت هایی را مشخص می کند که وقتی یک استثنا رخ می دهد باید اجرا شوند

شرط کنترلی را مشخص می کند switch در عبارت

را خاتمه می دهد switch یک حلقه یا عبارت

معرف نوع بولین

بیتی : | OR مترادفی برای عملگر

بیتی : & AND مترادفی برای عملگر

کلاس ذخیره سازی برای اشیایی که فقط درون بلاک خودشان ایاجد می شوند

اجازه می دهد تا اطلاعات مستقیما به اسمبلر فرستاده شود

بیتی : =& AND مترادفی برای عملگر تخصیصی

&& : AND مترادفی برای عملگر منطقی

شرح

default: sum = 0;

continue;

pp = const_cast<T*>(p)

const int s = 32;

b0 = compl b1;

class X { … };

char c;

catch(error)

case (n/10)

break;

bool flag;

b0 = b1 bitor b2;

b0 = b1 bitand b2;

auto int n;

asm ("check");

b1 and_eq b2;

(x>0 and x<8)

مثال

 

 

 

398 برنامه سازی پیشرفته

int

inline

if

goto

friend

for

float

false

extern

export

explicit

enum

else

dynamic_cast

double

do

delete

کلمه کلیدی

معرف نوع عددی صحیح

تابعی را تعریف می کند که متن آن تابع باید به جای فراخوانی آن درج شود.

ایجاد می کند if یک عبارت شرطی

باعث می شود تا اجرای برنامه به یک جملۀ برچسب دار پرش کند

در یک کلاس، تابع دوست ایجاد می کند

ایجاد می کند for یک حلقه

معرف نوع عددی حقیقی (ممیز شناور)

bool یکی از دو مقدار نوع

کلاس ذخیره سازی برای اشیایی که بیرون از بلوک محلی تعریف شده اند

دسترسی از واحد کامپایل دیگر را ممکن می سازد

باعث می شود تا از فراخوانی ضمنی یک سازنده جلوگیری شود

برای تعریف نوع شمارشی استفاده می شود

را مشخص می کند if بخش دیگر عبارت

را بر می گرداند T* برای اشاره گر داده شده، اشاره گر

نوع عددی حقیقی (ممیز شناور با دقت مضاعف)

را مشخص می کند do..while یک حلقه

تخصیص یافته آزاد می کند new حافظه ای را که با عبارت

شرح

int n;

inline int f();

if (n>0) …

goto error;

friend int f();

for ( ; ; ) …

float x;

bool flag=false;

extern int max;

export template<class T>

explicit X(int n);

enum bool {…};

else n=0;

pp = dynamic_cast<T*>p

double x;

do {…} while …

delete a;

مثال

 

399 C++ ضمیمۀ ج / کلمات کلیدی

signed

short

return

reinterpret_cast

register

public

protected

private

or_eq

or

opereator

not_eq

not

new

namespace

mutable

long

کلمه کلیدی

برای تعریف انواع صحیح علامت دار به کار می رود

معرف نوع صحیح محدود

عبارتی که تابع را خاتمه می دهد و یک مقدار را بر می گرداند

یک شی با نوع و مقدار داده شده را بر می گرداند

مشخص کننده کلاس ذخیره سازی برای اشیایی که در ثبات ها ذخیره می شوند

اعضای عمومی را در یک کلاس مشخص می کند

اعضای حفاظت شده را در یک کلاس مشخص می کند

اعضای خصوصی را در یک کلاس مشخص می کند

بیتی : =| OR مترادفی برای عملگر تخصیصی

منطقی : || OR مترادفی برای عملگر

برای تعریف سربارگذاری عملگرها به کار می رود

مترادفی برای عملگر نابرابری : =!

منطقی : ! NOT مترادفی برای عملگر

حافظه ای را تخصیص می دهد

بلوک های فضای نام (میدان) را می شناساند

به توابع تغییر ناپذیر اجازه می دهد تا فیلد را تغییر دهند

برای تعریف انواع گسترش یافته صحیح و حقیقی استفاده می شود

شرح

signed char c;

short n;

return 0;

pp = reinterpret_cast<T*>(p)

register int i;

public: int n;

protected: int n;

private: int n;

b1 or_eq b2;

(x>0 or x<8)

x operator++()

(x not_eq 0)

(not(x==0))

int* p = new int;

namespace best { int num; }

mutable string ssn;

long double x;

مثال

 

400 برنامه سازی پیشرفته

virtual

unsigned

union

using

typename

typeid

typedef

try

true

throw

this

template

switch

struct

static_cast

static

sizeof

کلمه کلیدی

تابع عضوی را تعریف می کند که در یک زیر کلاس نیز تعریف شده

برای تعریف انواع صحیح بدون علامت استفاده می شود

ساختاری را مشخص می کند که اجزای آن از حافظه مشترک استفاده می کنند

دستوری که اجازه می دهد تا پیشوند و فضای نام حذف شود

class مترادفی برای کلمه کلیدی

شیئی را بر می گرداند که نوع یک عبارت را نشان می دهد

برای یک نوع موجود، مترادفی را تعریف می کند

بلوکی را مشخص می کند که شامل مدیریت کننده استثنا است

bool یکی از مقادیر ممکن برای متغیرهای نوع

برای تولید یک استثنا به کار می رود

اشاره گری که به شیء جاری اشاره می کند

را مشخص می کند template یک کلاس

را مشخص می کند switch یک عبارت

تعریف یک ساختار را مشخص می کند

بر می گرداند T* برای اشاره گر داده شده یک اشاره گر

کلاس ذخیره سازی برای اشیایی که در طول اجرای برنامه وجود دارند

تعداد بایت هایی که برای ذخیره سازی یک شی استفاده شده را بر می گرداند

شرح

virtual int f();

unsigned int b;

union z { … };

using namespace std;

typename X { … };

cout << typeid(x).name();

typedef int Num;

try { … }

bool flag = true;

throw x();

return *this;

template <class t>

switch (n) { … }

struct X {…};

pp = static_cast<T*>p

static int n;

n = sizeof(float);

مثال

 

401 C++ ضمیمۀ ج / کلمات کلیدی

xor_eq

xor

while

wchar_t

volatile

void

کلمه کلیدی

انحصاری بیتی : =^ OR معادلی برای عملگر تخصیصی

انحصاری بیتی : ^ OR معادلی برای عملگر

ایجاد می کند while یک حلقه

unicode نوع کاراکتری عریض ( 16 بیتی) برای

اشیایی را تعریف می کند که می توانند خارج از کنترل برنامه تغییر داده شوند

عدم وجود نوع بازگشتی را معین می کند

شرح

b1 xor_eq b2;

b0 = b1 xor b2;

while (n > 0) …

wchar_t province;

int volatile n;

void f();

مثال

 

 

 

« د » ضمیمه

استاندارد C++ عملگرهای

با توجه به حق تقدم آ نها فهرست شده است. عملگرهای C++ در این جدول همۀ عملگرهای

با سطح تقدم بالاتر قبل از عملگرهای با سطح تقدم پایین تر ارزیابی می شوند. برای مثال در عبارت

عملگر * ابتدا ارزیابی می شود و سپس عملگر دوم یعنی – ارزیابی می گردد زیرا * در (a-b*c)

تقدم سطح 13 است که بالاتر از سطح تقدم – که 12 است می باشد.

مشخص شده، می گوید که آن عملگر از چپ ارزیابی می شود « وابستگی » ستونی که با عبارت

ارزیابی می شود زیرا – ((a-b)-c) به صورت (a-b-c) یا از راست. برای مثال عبارت

وابسته به چپ است.

مشخص شده، می گوید که آن عملگر بر روی چند عملگر عمل می کند. « جمعیت » ستونی که با

مشخص شده، می گوید که آیا عملگر قابل سربارگذاری هست یا خیر. « سربار » ستونی که با

(سربارگذاری را در فصل دهم مطالعه کنید).

عملوند نام سطح وابستگی جمعیت سربار مثال

::x :: جداسازی حوزه سراسری 17 راست یک خیر

X::x :: جداسازی حوزه کلاسی 17 چپ دو خیر

s.len . انتخاب عضو مستقیم 16 چپ دو خیر

p->len <- انتخاب عضو غیر مستقیم 16 چپ دو بله

a[i] [] جانشین معادل 16 چپ دو بله

rand() () فراخوانی تابع 16 چپ ‐‐ بله

int(ch) () ساختن انواع 16 چپ ‐‐ بله

n++ ++ پس افزایشی 16 راست یک بله

n-- -- پس کاهشی 16 راست یک بله

sizeof(a) اندازه شی یا نوع 15 راست یک خیر sizeof

 

استاندارد 403 C++ ضمیمۀ د / عملگر های

++n ++ پیش افزایشی 15 راست یک بله

--n -- پیش کاهشی 15 راست یک بله

عملوند نام سطح وابستگی جمعیت سربار مثال

~s ~ مکمل و منفی کردن 15 راست یک بله

!p منطقی 15 راست یک بله NOT !

+n + جمع بدون وابستگی 15 راست یک بله

-n - تفریق بدون وابستگی 15 راست یک بله

*p * عملگر اشاره 15 راست یک بله

&x & آدرس 15 راست یک بله

new p تخصیص حافظه 15 راست یک بله new

delete p آزاد سازی حافظه 15 راست یک بله delete

int(ch) () تبدیل نوع 15 راست دو بله

x.*q *. انتخاب عضو مستقیم 14 چپ دو خیر

p->q *<- انتخاب عضو غیر مستقیم 14 چپ دو بله

m * n * ضرب 13 چپ دو بله

m / n / تقسیم 13 چپ دو بله

m % n % باقیمانده 13 چپ دو بله

m + n + جمع 12 چپ دو بله

m - n - تفریق 12 چپ دو بله

cout << n >> تغییر جهت به چپ 11 چپ دو بله

cin >> n << تغییر جهت به راست 11 چپ دو بله

x < y > کوچک تر 10 چپ دو بله

x <= y => کوچک تر یا مساوی 10 چپ دو بله

x > y < بزرگ تر 10 چپ دو بله

x >= y =< بزرگ تر یا مساوی 10 چپ دو بله

x == y == برابری 9 چپ دو بله

x != y =! نابرابری 9 چپ دو بله

s & t 8 چپ دو بله AND & نشانه

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

404 برنامه سازی پیشرفته

S ^ t 7 چپ دو بله XOR ^ نشانه

s | t 6 چپ دو بله OR | نشانه

u && v منطقی 5 چپ دو بله AND &&

u || v منطقی 4 چپ دو بله OR ||

U ? x : y :? عبارت شرطی 3 چپ سه خیر

n = = تخصیص 2 راست دو بله 22

n += =+ جمع تخصیصی 2 راست دو بله 8

عملوند نام سطح وابستگی جمعیت سربار مثال

n -= =- تفریق تخصیصی 2 راست دو بله 4

n *= - =* ضرب تخصیصی 2 راست دو بله 1

n /= =/ تقسیم تخصیصی 2 راست دو بله 10

n %= =% باقیمانده تخصیصی 2 راست دو بله 10

s &= mask تخصیصی 2 راست دو بله AND &=

s ^= mask تخصیصی 2 راست دو بله XOR ^=

s |= mask تخصیصی 2 راست دو بله OR |=

=>> تغییر جهت به چپ

تخصیصی

s << 2 راست دو بله 1

=<< تغییر جهت به راست

تخصیصی

s >> 2 راست دو بله 1

++m, --n , کاما 0 چپ دو بله

 

« ه » ضمیمه

فهرست منابع و مأخذ

[Cline]

C++ FAQs, Second Edition, by Marshall Cline, Greg Lomow, and Mike Girou.

Addison-Wesley Publishing Company, Reading, MA (1999) 0-201-30983-1

[Deitel]

C++ How to Program, Second Edition by H. M. Deitel and P. J. Deitel.

Prentice Hall, Englewood Cliffs, NJ (1998) 0-13-528910-6.

[Hubbard1]

Foundamentals of Computing with C++, by John R. Hubbard.

McGraw-Hill, Inc, New York, NY (1998) 0-07-030868-3.

[Hubbard2]

Data Structures with C++, by John R. Hubbard.

McGraw-Hill, Inc, New York, NY (1999) 0-07-135345-3.

[Hubbard3]

Programming with C++, Second Edition, by John R. Hubbard.

McGraw-Hill, Inc, New York, NY (2000) 0-07-118372-8.

[Hughes]

Mastering the Standard C++ Classes, by Cameron Hughes and Tracey Hughes.

John Wiley & Sons, Inc, New York, NY (1999) 0-471-32893-6.

[Johnsonbaugh]

Object_Oriented Programming in C++, by Richard Johnsonbaugh and Martin Kalin.

Prentice Hall, Englewood Cliffs, NJ (1995) 0-02-360682-7.

[Perry]

An Introduction to Object-Oriented Design in C++, by Jo Ellen Perry and Harold D. Levin.

Addison-Wesley Publishing Company, Reading, MA (1996) 0-201-76564-0.

[Savitch]

Problem Solving with C++, by Walter Savitch.

Addison-Wesley Publishing Company, Reading, MA (1996) 0-8053-7440-X.

[Stroustrup1]

The C++ Programming Languages, special Edition, by Bjarne Stroustrup.

Addison-Wesley Publishing Company, Reading, MA (2000) 0-201-70073-5.

[Stroustrup2]

The Design and Evolution of C++, by Bjarne Stroustrup.

Addison-Wesley Publishing Company, Reading, MA (1994) 0-201-54330-3.

[Weiss]

Data Structures and Algorithm Analysis in C++, by Mark Allen Weiss.

Benjamin/Cummings Publishing Company, Redwood City, CA (1994) 0-8053-5443-3.

 

فهرست مطالب

فصل اول

«C++ مقدمات برنامه نویسی با »

1 ؟ C++ 1چرا ‐1

2 C++ 1 تاریخچۀ –2

1 آماده سازی مقدمات 3 –3

4 C++ 1 شروع کار با –4

1 عملگر خروجی 10 –5

1 لیترال ها و کاراکترها 11 –6

1 متغیرها و تعریف آن ها: 12 –7

1 مقداردهی اولیه به متغیرها 15 –8

1 ثابت ها 16 –9

1 عملگر ورودی 17 –10

پرسش های گزینه ای 20

پرسش های تشریحی 22

تمرین های برنامه نویسی 23

فصل دوم

« انواع اصلی »

2 انواع دادۀ عددی 25 –1

2 متغیر عدد صحیح 26 –2

2 محاسبات اعداد صحیح 28 –3

2 عملگرهای افزایشی و کاهشی 29 –4

2 عملگرهای مقدارگذاری مرکب 31 –5

2 انواع ممیز شناور 32 –6

2 تعریف متغیر ممیز شناور 33 –7

2 شکل علمی مقادیر ممیز شناور 35 –8

36 bool 2 نوع بولین –9

37 char 2 نوع کاراکتری ‐10

39 enum 2 نوع شمارشی –11

2 تبدیل نوع، گسترش نوع 42 –12

2 برخی از خطاهای برنامه نویسی 45 –13

2 سرریزی عددی 46 –14

2 خطای گرد کردن 48 –5

2 حوزۀ متغیرها 54 –6

پرسش های گزینه ای 58

پرسش های تشریحی 60

تمرین های برنامه نویسی 61

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

فصل سوم

« انتخاب »

63 if 3 دستور ‐1

65 if..else 3 دستور ‐2

3 عملگرهای مقایسه ای 66 ‐4

3 بلوک های دستورالعمل 68 ‐5

3 شرط های مرکب 71 ‐6

3 ارزیابی میانبری 73 ‐7

3 عبارات منطقی 74 ‐8

3 دستور های انتخاب تودرتو 75 ‐9

79 else if 3 ساختار ‐10

81 switch 3 دستورالعمل ‐11

3 عملگر عبارت شرطی 84 ‐12

3 کلمات کلیدی 85 ‐13

پرسش های گزینه ای 87

پرسش های تشریحی 90

تمرین های برنامه نویسی 93

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

 

فصل چهارم

« تکرار »

مقدمه 95

95 while 4 دستور ‐1

4 خاتمه دادن به یک حلقه 98 ‐2

102 do..while 4 دستور ‐3

104 for 4 دستور ‐4

110 break 4 دستور ‐5

112 continue 4 دستور ‐6

114 goto 4 دستور ‐7

4 تولید اعداد شبه تصادفی 116 ‐8

پرسش های گزینه ای 124

پرسش های تشریحی 127

تمرین های برنامه نویسی 128

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

فصل پنجم

« توابع »

5 مقدمه 130 ‐1

استاندارد 130 C++ 5 توابع کتابخانه ای ‐2

5 توابع ساخت کاربر 135 ‐3

5 برنامۀ آزمون 136 ‐4

5 اعلان ها و تعاریف تابع 139 ‐5

5 کامپایل جداگانۀ توابع 141 ‐6

5 متغیرهای محلی، توابع محلی 143 ‐6

146 void 5 تابع ‐7

5 توابع بولی 148 ‐8

150 (I/O) 5 توابع ورودی/خروجی ‐9

5 ارسال به طریق ارجاع (آدرس) 152 ‐14

5 ارسال از طریق ارجاع ثابت 158 ‐11

5 توابع بی واسطه 160 ‐12

5 چندشکلی توابع 161 ‐13

163 main() 5 تابع ‐14

5 آرگومان های پیش فرض 165 ‐15

پرسش های گزینه ای 167

پرسش های تشریحی 170

تمرین های برنامه نویسی 170

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

فصل ششم

« آرایه ها »

6 مقدمه 174 ‐1

6 پردازش آرایه ها 175 ‐2

6 مقداردهی آرایه ها 177 ‐3

6 ایندکس بیرون از حدود آرایه 180 ‐4

6 ارسال آرایه به تابع 183 ‐5

6 الگوریتم جستجوی خطی 187 ‐6

6 مرتب سازی حبابی 189 ‐7

6 الگوریتم جستجوی دودویی 190 ‐8

6 استفاده از انواع شمارشی در آرایه 195 ‐9

6 تعریف انواع 196 ‐10

6 آرایه های چند بعدی 199 ‐11

پرسش های گزینه ای 204

پرسش های تشریحی 208

تمرین های برنامه نویسی 208

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

فصل هفتم

 

 

« اشاره گرها و ارجاع ها »

7 مقدمه 214 ‐1

7 عملگر ارجاع 215 ‐1

7 ارجاع ها 216 ‐2

7 اشاره گرها 218 ‐3

7 مقداریابی 219 ‐4

7 چپ مقدارها، راست مقدارها 222 ‐6

7 بازگشت از نوع ارجاع 223 ‐7

7 آرایه ها و اشاره گرها 225 ‐8

230 new 7 عملگر ‐13

232 delete 7 عملگر ‐14

7 آرایه های پویا 233 ‐9

7 اشاره گر ثابت 236 ‐10

7 آرایه ای از اشاره گرها 237 ‐11

7 اشاره گری به اشاره گر دیگر 238 ‐12

7 اشاره گر به توابع 238 ‐13

240 NULL و NUL 7‐14

پرسش های گزینه ای 242

پرسش های تشریحی 245

تمرین های برنامه نویسی 248

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

 

فصل هشتم

« استاندارد C++ رشته های کاراکتری و فایل ها در »

8 مقدمه 250 ‐1

8 مروری بر اشاره گرها 251 ‐2

252 C 8 رشته های کاراکتری در ‐3

8 ورودی /خروجی رشته های کاراکتری 253 ‐ 4

256 cout و cin 8 چند تاب ع عضو ‐5

استاندارد 261 C 8 توابع کاراکتری ‐6

8 آرایه ای از رشته ها 262 ‐7

8 توابع استاندارد رشته های کاراکتری 266 ‐8

استاندارد 275 C++ 8 رشته های کاراکتری در ‐9

8 نگاهی دقیق تر به تبادل داده ها 275 ‐10

8 ورودی قالب بندی نشده 278 ‐11

استاندارد 281 C++ در string 8 نوع ‐12

8 فایل ها 284 ‐13

پرسش های گزینه ای 290

پرسش های تشریحی 29

تمرین های برنامه نویسی 296

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

فصل نهم

 

« شی گرایی »

9 مقدمه 299 ‐1

9 اعلان کلاس ها 303 ‐2

9 سازنده ها 309 ‐3

9 فهرست مقداردهی در سازنده ها 312 ‐4

9 توابع دستیابی 313 ‐5

9 توابع عضو خصوصی 314 ‐6

9 سازندۀ کپی 316 ‐7

9 نابود کننده 319 ‐8

9 اشیای ثابت 321 ‐9

9 اشاره گر به اشیا 322 ‐10

9 اعضای داده ای ایستا 325 ‐11

9 توابع عضو ایستا 328 ‐12

پرسش های گزینه ای 330

پرسش های تشریحی 333

تمرین های برنامه نویسی 334

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

فصل دهم

« سربارگذاری عملگرها »

10 مقدمه 337 ‐1

10 توابع دوست 338 ‐2

10 سربارگذاری عملگر جایگزینی (=) 339 ‐3

340 this 10 اشاره گر ‐4

10 سربارگذاری عملگرهای حسابی 342 ‐5

10 سربارگذاری عملگرهای ‐6

جایگزینی حسابی 344

10 سربارگذاری عملگرهای رابطه ای 346 ‐7

10 سربارگذاری عملگرهای ‐8

افزایشی و کاهشی 347

پرسش های گزینه ای 352

پرسش های تشریحی 354

تمرین های برنامه نویسی 354

 

 

mohsen_mahyar@yahoo.com

mo-mah.persianblog.ir

 

فصل یازدهم

« ترکیب و وراثت »

12 مقدمه 357 ‐1

12 ترکیب 357 ‐2

11 وراثت 361 ‐3

11 اعضای حفاظت شده 364 ‐4

11 غلبه کردن بر وراثت 367 ‐5

11 اشاره گرها در وراثت 371 ‐6

11 توابع مجازی و چندریختی 373 ‐7

11 نابودکنندۀ مجازی 377 ‐8

11 کلاس های پایۀ انتزاعی 379 ‐9

پرسش های گزینه ای 382

پرسش های تشریحی 385

تمرین های برنامه نویسی 386

ضمیمه الف : پاسخ نام ۀ پرسش های گزینه ای 383

ضمیمه ب : جدول اسکی

387

استاندارد 393 C++ ضمیمه ج : کلمات کلیدی

استاندارد 398 C++ ضمیمه د : عملگرهای

ضمیمه ه : فهرست منابع و مأخذ 401

 

 

 

mohsen_mahyar@yahoo.com

 

mo-mah.persianblog.ir

 

پایان

موفق باشید

محسن قاسمی

 

 

 

 

   + MOHSEN GHASEMI - ۱:٢٢ ‎ب.ظ ; ۱۳۸٩/٥/٢٦