Share E-Book

Professional C++ (Marc Gregoire) (z-library.sk, 1lib.sk, z-lib.sk)

Author

Rating No ratings yet

Log in to rate

C++
Language English

Get up to date quickly on the new changes coming with C++17 Professional C++ is the advanced manual for C++ programming. Designed to help experienced developers get more out of the latest release, this book skims over the basics and dives right in to exploiting the full capabilities of C++17. Each feature is explained by example, each including actual code snippets that you can plug into your own applications. Case studies include extensive, working code that has been tested on Windows and Linux, and the author's expert tips, tricks, and workarounds can dramatically enhance your workflow. Even many experienced developers have never fully explored the boundaries of the language's capabilities; this book reveals the advanced features you never knew about, and drills down to show you how to turn these features into real-world solutions. The C++17 release includes changes that impact the way you work with C++; this new fourth edition covers them all, including nested namespaces, structured bindings, string_view, template argument deduction for constructors, parallel algorithms, generalized sum algorithms, Boyer-Moore string searching, string conversion primitives, a filesystem API, clamping values, optional values, the variant type, the any type, and more. Clear explanations and professional-level depth make this book an invaluable resource for any professional needing to get up to date quickly. * Maximize C++ capabilities with effective design solutions * Master little-known elements and learn what to avoid * Adopt new workarounds and testing/debugging best practices * Utilize real-world program segments in your own applications C++ is notoriously complex, and whether you use it for gaming or business, maximizing its functionality means keeping up to date with the latest changes. Whether these changes enhance your work or make it harder depends on how well-versed you are in the newest C++ features. Professional C++ gets you up to date quickly, and provides the ans

Format PDF
Size 23.8 MB
8
Views
(First 20 pages)

Registered users can read the full content for free

Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.

Page 1
(This page has no text content)
Page 2
PROFESSIONAL C++ INTRODUCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvii ▸ PART I INTRODUCTION TO PROFESSIONAL C++ CHAPTER 1 A Crash Course in C++ and the Standard Library . . . . . . . . . . . . . . . 3 CHAPTER 2 Working with Strings and String Views . . . . . . . . . . . . . . . . . . . . . . . 57 CHAPTER 3 Coding with Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 ▸ PART II PROFESSIONAL C++ SOFTWARE DESIGN CHAPTER 4 Designing Professional C++ Programs . . . . . . . . . . . . . . . . . . . . . . . 95 CHAPTER 5 Designing with Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 CHAPTER 6 Designing for Reuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 ▸ PART III C++ CODING THE PROFESSIONAL WAY CHAPTER 7 Memory Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 CHAPTER 8 Gaining Proficiency with Classes and Objects . . . . . . . . . . . . . . . . 199 CHAPTER 9 Mastering Classes and Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 CHAPTER 10 Discovering Inheritance Techniques . . . . . . . . . . . . . . . . . . . . . . . . 277 CHAPTER 11 C++ Quirks, Oddities, and Incidentals . . . . . . . . . . . . . . . . . . . . . . 333 CHAPTER 12 Writing Generic Code with Templates . . . . . . . . . . . . . . . . . . . . . . 373 CHAPTER 13 Demystifying C++ I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 CHAPTER 14 Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 CHAPTER 15 Overloading C++ Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 CHAPTER 16 Overview of the C++ Standard Library . . . . . . . . . . . . . . . . . . . . . . 507 CHAPTER 17 Understanding Containers and Iterators . . . . . . . . . . . . . . . . . . . . 535 CHAPTER 18 Mastering Standard Library Algorithms . . . . . . . . . . . . . . . . . . . . . 607 CHAPTER 19 String Localization and Regular Expressions . . . . . . . . . . . . . . . . . 663 CHAPTER 20 Additional Library Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691 Continues
Page 3
▸ PART IV MASTERING ADVANCED FEATURES OF C++ CHAPTER 21 Customizing and Extending the Standard Library . . . . . . . . . . . . . 727 CHAPTER 22 Advanced Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 CHAPTER 23 Multithreaded Programming with C++ . . . . . . . . . . . . . . . . . . . . . . 813 ▸ PART V C++ SOFTWARE ENGINEERING CHAPTER 24 Maximizing Software Engineering Methods . . . . . . . . . . . . . . . . . . 859 CHAPTER 25 Writing Efficient C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881 CHAPTER 26 Becoming Adept at Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909 CHAPTER 27 Conquering Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933 CHAPTER 28 Incorporating Design Techniques and Frameworks . . . . . . . . . . . . 971 CHAPTER 29 Applying Design Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991 CHAPTER 30 Developing Cross-Platform and Cross-Language Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017 APPENDIX A C++ Interviews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1039 APPENDIX B Annotated Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1063 APPENDIX C Standard Library Header Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1075 APPENDIX D Introduction to UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083 INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087
Page 4
PROFESSIONAL C++
Page 5
PROFESSIONAL C++ Fourth Edition Marc Gregoire
Page 6
Professional C++, Fourth Edition Published by John Wiley & Sons, Inc. 10475 Crosspoint Boulevard Indianapolis, IN 46256 www.wiley.com Copyright © 2018 by John Wiley & Sons, Inc., Indianapolis, Indiana Published simultaneously in Canada ISBN: 978-1-119-42130-6 ISBN: 978-1-119-42126-9 (ebk) ISBN: 978-1-119-42122-1 (ebk) Manufactured in the United States of America 10 9 8 7 6 5 4 3 2 1 No part of this publication may be reproduced, stored in a retrieval system or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, scanning or otherwise, except as permitted under Sections 107 or 108 of the 1976 United States Copyright Act, without either the prior written permission of the Publisher, or authorization through payment of the appropriate per-copy fee to the Copyright Clearance Center, 222 Rosewood Drive, Danvers, MA 01923, (978) 750-8400, fax (978) 646-8600. Requests to the Publisher for permission should be addressed to the Permissions Department, John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030, (201) 748-6011, fax (201) 748- 6008, or online at http://www.wiley.com/go/permissions. Limit of Liability/Disclaimer of Warranty: The publisher and the author make no representations or warranties with respect to the accuracy or completeness of the contents of this work and specifically disclaim all warranties, including without limitation warranties of fitness for a particular purpose. No warranty may be created or extended by sales or pro- motional materials. The advice and strategies contained herein may not be suitable for every situation. This work is sold with the understanding that the publisher is not engaged in rendering legal, accounting, or other professional services. If professional assistance is required, the services of a competent professional person should be sought. Neither the pub- lisher nor the author shall be liable for damages arising herefrom. The fact that an organization or Web site is referred to in this work as a citation and/or a potential source of further information does not mean that the author or the publisher endorses the information the organization or Web site may provide or recommendations it may make. Further, readers should be aware that Internet Web sites listed in this work may have changed or disappeared between when this work was written and when it is read. For general information on our other products and services please contact our Customer Care Department within the United States at (877) 762-2974, outside the United States at (317) 572-3993 or fax (317) 572-4002. Wiley publishes in a variety of print and electronic formats and by print-on-demand. Some material included with stan- dard print versions of this book may not be included in e-books or in print-on-demand. If this book refers to media such as a CD or DVD that is not included in the version you purchased, you may download this material at http:// booksupport.wiley.com. For more information about Wiley products, visit www.wiley.com. Library of Congress Control Number: 2017963243 Trademarks: Wiley, the Wiley logo, Wrox, the Wrox logo, Programmer to Programmer, and related trade dress are trade- marks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries, and may not be used without written permission. All other trademarks are the property of their respective owners. John Wiley & Sons, Inc., is not associated with any product or vendor mentioned in this book.
Page 7
Dedicated to my parents and my brother, who are always there for me. Their support and patience helped me in finishing this book.
Page 8
ABOUT THE AUTHOR MARC GREGOIRE is a software architect from Belgium. He graduated from the University of Leuven, Belgium, with a degree in “Burgerlijk ingenieur in de computer wetenschappen” (equivalent to mas- ter of science in engineering: computer science). The year after, he received an advanced master’s degree in artificial intelligence, cum laude, at the same university. After his studies, Marc started working for a software consultancy company called Ordina Belgium. As a consultant, he worked for Siemens and Nokia Siemens Networks on critical 2G and 3G software running on Solaris for tele- com operators. This required working with international teams stretching from South America and the United States to Europe, the Middle East, Africa, and Asia. Now, Marc is a software architect at Nikon Metrology (www.nikonmetrology.com), a division of Nikon and a leading provider of preci- sion optical instruments and metrology solutions for 3D geometric inspection. His main expertise is in C/C++, and specifically Microsoft VC++ and the MFC framework. He has experience in developing C++ programs running 24/7 on Windows and Linux platforms: for exam- ple, KNX/EIB home automation software. In addition to C/C++, Marc also likes C# and uses PHP for creating web pages. Since April 2007, he has received the annual Microsoft MVP (Most Valuable Professional) award for his Visual C++ expertise. Marc is the founder of the Belgian C++ Users Group (www.becpp.org), co-author of C++ Standard Library Quick Reference (Apress), technical editor for numerous books for several publishers, and a member on the CodeGuru forum (as Marc G). He maintains a blog at www.nuonsoft.com/blog/, and is passionate about traveling and gastronomic restaurants.
Page 9
ABOUT THE TECHNICAL EDITOR PETER VAN WEERT is a Belgian software engineer, whose main interests and expertise are in C++, programming languages, algorithms, and data structures. He received his master of science in computer science from the University of Leuven, Belgium, summa cum laude, with congratulations of the Board of Examiners. In 2010, the same university awarded him a PhD for his research on the efficient compilation of rule-based programming lan- guages (mainly Java). During his doctoral studies, he was a teaching assistant for courses on object- oriented analysis and design, Java programming, and declarative programming languages. After his studies, Peter worked for Nikon Metrology on large-scale, industrial-application software in the area of 3D laser scanning and point cloud inspection. In 2017, he joined the software R&D unit of Nobel Biocare, which specializes in digital dentistry software. Throughout his professional career, Peter has mastered C++ software development, as well as the management, refactoring, and debugging of very large code bases. He also gained further proficiency in all aspects of the software development process, including the analysis of functional and technical requirements, and Agile- and Scrum-based project and team management. Peter is a regular speaker at, and board member of, the Belgian C++ Users Group. He also co- authored two books: C++ Standard Library Quick Reference and Beginning C++ (5th edition), both published by Apress.
Page 10
PROJECT EDITOR Adaobi Obi Tulton TECHNICAL EDITOR Peter Van Weert PRODUCTION EDITOR Athiyappan Lalith Kumar COPY EDITOR Marylouise Wiack MANAGER OF CONTENT DEVELOPMENT AND ASSEMBLY Mary Beth Wakefield PRODUCTION MANAGER Kathleen Wisor MARKETING MANAGER Christie Hilbrich EXECUTIVE EDITOR Jim Minatel PROJECT COORDINATOR, COVER Brent Savage PROOFREADER Nancy Bell INDEXER Johnna VanHoose Dinse COVER DESIGNER Wiley COVER IMAGE © ittipon/Shutterstock CREDITS
Page 11
ACKNOWLEDGMENTS I THANK THE JOHN WILEY & SONS AND WROX Press editorial and production teams for their sup- port. Especially, thank you to Jim Minatel, executive editor at Wiley, for giving me a chance to write this new edition, Adaobi Obi Tulton, project editor, for managing this project, and Marylouise Wiack, copy editor, for improving readability and consistency and making sure the text is gram- matically correct. A very special thank you to my technical editor, Peter Van Weert, for his outstanding technical review. His many constructive comments and ideas have certainly made this book better. Of course, the support and patience of my parents and my brother were very important in finishing this book. I would also like to express my sincere gratitude toward my employer, Nikon Metrology, for supporting me during this project. Finally, I thank you, the reader, for trying this approach to professional C++ software development.
Page 12
CONTENTS INTRODUCTION xlvii ParT I: INTrODUCTION TO PrOFESSIONaL C++ ChaPTEr 1: a CraSh COUrSE IN C++ aND ThE STaNDarD LIBrarY 3 The Basics of C++ 4 The Obligatory Hello, World 4 Comments 4 Preprocessor Directives 5 The main() Function 6 I/O Streams 7 Namespaces 8 Literals 10 Variables 10 Operators 13 Types 15 Enumerated Types 15 Structs 16 Conditional Statements 17 if/else Statements 17 switch Statements 18 The Conditional Operator 20 Logical Evaluation Operators 20 Functions 21 Function Return Type Deduction 22 Current Function’s Name 23 C-Style Arrays 23 std::array 25 std::vector 25 Structured Bindings 26 Loops 26 The while Loop 26 The do/while Loop 27 The for Loop 27
Page 13
xviii CONTENTS The Range-Based for Loop 27 Initializer Lists 28 Those Are the Basics 28 Diving Deeper into C++ 28 Strings in C++ 29 Pointers and Dynamic Memory 29 The Stack and the Heap 29 Working with Pointers 30 Dynamically Allocated Arrays 31 Null Pointer Constant 32 Smart Pointers 33 The Many Uses of const 35 const Constants 35 const to Protect Parameters 35 References 35 Pass By Reference 36 Pass By const Reference 37 Exceptions 37 Type Inference 38 The auto Keyword 39 The decltype Keyword 40 C++ as an Object-Oriented Language 40 Defining Classes 40 Using Classes 43 Uniform Initialization 43 Direct List Initialization versus Copy List Initialization 45 The Standard Library 46 Your First Useful C++ Program 46 An Employee Records System 46 The Employee Class 47 Employee.h 47 Employee.cpp 48 EmployeeTest.cpp 50 The Database Class 50 Database.h 50 Database.cpp 51 DatabaseTest.cpp 52 The User Interface 53 Evaluating the Program 55 Summary 56
Page 14
xix CONTENTS ChaPTEr 2: WOrKING WITh STrINGS aND STrING VIEWS 57 Dynamic Strings 58 C-Style Strings 58 String Literals 60 Raw String Literals 60 The C++ std::string Class 62 What Is Wrong with C-Style Strings? 62 Using the string Class 62 std::string Literals 64 High-Level Numeric Conversions 64 Low-Level Numeric Conversions 65 The std::string_view Class 67 std::string_view Literals 69 Nonstandard Strings 69 Summary 69 ChaPTEr 3: CODING WITh STYLE 71 The Importance of Looking Good 71 Thinking Ahead 72 Elements of Good Style 72 Documenting Your Code 72 Reasons to Write Comments 72 Commenting to Explain Usage 72 Commenting to Explain Complicated Code 74 Commenting to Convey Meta-information 75 Commenting Styles 77 Commenting Every Line 77 Prefix Comments 78 Fixed-Format Comments 79 Ad Hoc Comments 80 Self-Documenting Code 81 Decomposition 81 Decomposition through Refactoring 82 Decomposition by Design 83 Decomposition in This Book 83 Naming 83 Choosing a Good Name 83 Naming Conventions 84 Counters 84 Prefixes 84
Page 15
xx CONTENTS Hungarian Notation 85 Getters and Setters 86 Capitalization 86 Namespaced Constants 86 Using Language Features with Style 86 Use Constants 87 Use References Instead of Pointers 87 Use Custom Exceptions 88 Formatting 88 The Curly Brace Alignment Debate 88 Coming to Blows over Spaces and Parentheses 89 Spaces and Tabs 90 Stylistic Challenges 90 Summary 91 ParT II: PrOFESSIONaL C++ SOFTWarE DESIGN ChaPTEr 4: DESIGNING PrOFESSIONaL C++ PrOGraMS 95 What Is Programming Design? 96 The Importance of Programming Design 97 Designing for C++ 99 Two Rules for C++ Design 100 Abstraction 100 Benefiting from Abstraction 100 Incorporating Abstraction in Your Design 101 Reuse 101 Writing Reusable Code 102 Reusing Designs 103 Reusing Existing Code 103 A Note on Terminology 104 Deciding Whether or Not to Reuse Code 105 Advantages to Reusing Code 105 Disadvantages to Reusing Code 105 Putting It Together to Make a Decision 106 Strategies for Reusing Code 107 Understand the Capabilities and Limitations 107 Understand the Performance 108 Understand Platform Limitations 110 Understand Licensing and Support 110 Know Where to Find Help 111 Prototype 111
Page 16
xxi CONTENTS Bundling Third-Party Applications 112 Open-Source Libraries 112 The Open-Source Movements 112 Finding and Using Open-Source Libraries 113 Guidelines for Using Open-Source Code 113 The C++ Standard Library 114 C Standard Library 114 Deciding Whether or Not to Use the Standard Library 114 Designing a Chess Program 114 Requirements 115 Design Steps 115 Divide the Program into Subsystems 115 Choose Threading Models 117 Specify Class Hierarchies for Each Subsystem 118 Specify Classes, Data Structures, Algorithms, and Patterns for Each Subsystem 118 Specify Error Handling for Each Subsystem 120 Summary 121 ChaPTEr 5: DESIGNING WITh OBJECTS 123 Am I Thinking Procedurally? 124 The Object-Oriented Philosophy 124 Classes 124 Components 125 Properties 125 Behaviors 126 Bringing It All Together 126 Living in a World of Objects 127 Over-Objectification 127 Overly General Objects 128 Object Relationships 129 The Has-A Relationship 129 The Is-A Relationship (Inheritance) 130 Inheritance Techniques 130 Polymorphism versus Code Reuse 131 The Fine Line between Has-A and Is-A 132 The Not-A Relationship 135 Hierarchies 136 Multiple Inheritance 137 Mixin Classes 138
Page 17
xxii CONTENTS Abstraction 138 Interface versus Implementation 138 Deciding on an Exposed Interface 139 Consider the Audience 139 Consider the Purpose 139 Consider the Future 141 Designing a Successful Abstraction 141 Summary 142 ChaPTEr 6: DESIGNING FOr rEUSE 143 The Reuse Philosophy 144 How to Design Reusable Code 144 Use Abstraction 145 Structure Your Code for Optimal Reuse 146 Avoid Combining Unrelated or Logically Separate Concepts 146 Use Templates for Generic Data Structures and Algorithms 148 Provide Appropriate Checks and Safeguards 150 Design for Extensibility 151 Design Usable Interfaces 153 Design Interfaces That Are Easy to Use 153 Design General-Purpose Interfaces 157 Reconciling Generality and Ease of Use 157 The SOLID Principles 158 Summary 159 ParT III: C++ CODING ThE PrOFESSIONaL WaY ChaPTEr 7: MEMOrY MaNaGEMENT 163 Working with Dynamic Memory 164 How to Picture Memory 164 Allocation and Deallocation 166 Using new and delete 166 What about My Good Friend malloc? 167 When Memory Allocation Fails 167 Arrays 168 Arrays of Basic Types 168 Arrays of Objects 170 Deleting Arrays 171 Multi-dimensional Arrays 172 Working with Pointers 175
Page 18
xxiii CONTENTS A Mental Model for Pointers 175 Casting with Pointers 176 Array-Pointer Duality 177 Arrays Are Pointers! 177 Not All Pointers Are Arrays! 179 Low-Level Memory Operations 179 Pointer Arithmetic 179 Custom Memory Management 180 Garbage Collection 181 Object Pools 182 Smart Pointers 182 unique_ptr 183 Creating unique_ptrs 183 Using unique_ptrs 185 unique_ptr and C-Style Arrays 186 Custom Deleters 186 shared_ptr 186 Casting a shared_ptr 187 The Need for Reference Counting 188 Aliasing 189 weak_ptr 189 Move Semantics 190 enable_shared_from_this 191 The Old Deprecated/Removed auto_ptr 192 Common Memory Pitfalls 192 Underallocating Strings 192 Accessing Out-of-Bounds Memory 193 Memory Leaks 194 Finding and Fixing Memory Leaks in Windows with Visual C++ 195 Finding and Fixing Memory Leaks in Linux with Valgrind 196 Double-Deleting and Invalid Pointers 197 Summary 197 ChaPTEr 8: GaINING PrOFICIENCY WITh CLaSSES aND OBJECTS 199 Introducing the Spreadsheet Example 200 Writing Classes 200 Class Definitions 200 Class Members 201 Access Control 201 Order of Declarations 203 In-Class Member Initializers 203
Page 19
xxiv CONTENTS Defining Methods 203 Accessing Data Members 204 Calling Other Methods 204 The this Pointer 206 Using Objects 207 Objects on the Stack 207 Objects on the Heap 207 Object Life Cycles 208 Object Creation 208 Writing Constructors 209 Using Constructors 210 Providing Multiple Constructors 211 Default Constructors 212 Constructor Initializers 215 Copy Constructors 218 Initializer-List Constructors 220 Delegating Constructors 222 Summary of Compiler-Generated Constructors 222 Object Destruction 224 Assigning to Objects 225 Declaring an Assignment Operator 225 Defining an Assignment Operator 226 Explicitly Defaulted and Deleted Assignment Operator 227 Compiler-Generated Copy Constructor and Copy Assignment Operator 228 Distinguishing Copying from Assignment 228 Objects as Return Values 228 Copy Constructors and Object Members 229 Summary 230 ChaPTEr 9: MaSTErING CLaSSES aND OBJECTS 231 Friends 232 Dynamic Memory Allocation in Objects 233 The Spreadsheet Class 233 Freeing Memory with Destructors 235 Handling Copying and Assignment 236 The Spreadsheet Copy Constructor 239 The Spreadsheet Assignment Operator 240 Disallowing Assignment and Pass-By-Value 242 Handling Moving with Move Semantics 243 Rvalue References 243 Implementing Move Semantics 245
Page 20
xxv CONTENTS Testing the Spreadsheet Move Operations 248 Implementing a Swap Function with Move Semantics 250 Rule of Zero 250 More about Methods 251 static Methods 251 const Methods 251 mutable Data Members 253 Method Overloading 253 Overloading Based on const 254 Explicitly Deleting Overloads 255 Inline Methods 255 Default Arguments 257 Different Kinds of Data Members 258 static Data Members 258 Inline Variables 259 Accessing static Data Members within Class Methods 259 Accessing static Data Members Outside Methods 260 const static Data Members 260 Reference Data Members 261 const Reference Data Members 262 Nested Classes 263 Enumerated Types inside Classes 264 Operator Overloading 265 Example: Implementing Addition for SpreadsheetCells 265 First Attempt: The add Method 265 Second Attempt: Overloaded operator+ as a Method 266 Third Attempt: Global operator+ 268 Overloading Arithmetic Operators 269 Overloading the Arithmetic Shorthand Operators 269 Overloading Comparison Operators 270 Building Types with Operator Overloading 271 Building Stable Interfaces 272 Using Interface and Implementation Classes 272 Summary 275 ChaPTEr 10: DISCOVErING INhErITaNCE TEChNIQUES 277 Building Classes with Inheritance 278 Extending Classes 278 A Client’s View of Inheritance 279 A Derived Class’s View of Inheritance 280 Preventing Inheritance 281
The above is a preview of the first 20 pages. Register to read the complete e-book.

Recommended for You

Loading recommended books...
Failed to load, please try again later

Tip the Site

Scan the WeChat Pay or Alipay code to tip. No login required.

WeChat Pay
Alipay
← Back to List