introduction to effective c++ programming kwanghee ko design laboratory department of ocean...
TRANSCRIPT
Introduction to Effective C++ Introduction to Effective C++ ProgrammingProgramming
Kwanghee Ko
Design LaboratoryDepartment of Ocean Engineering
Massachusetts Institute of TechnologyDay 3
General GuidelinesGeneral Guidelines
Avoid returning “handles” to internal data.Avoid member functions that return non-
const pointers or references to members less accessible than themselves.
Never return a reference to a local object or to a dereferenced pointer initialized by new with in the function (memory leakage).
Postpone variable definitions as long as possible.
General GuidelinesGeneral Guidelines
Public inheritance models : “isa” relation?– Ex. A bus is a vehicle?
Never redefine an inherited non-virtual function.
Never redefine an inherited default parameter value.
Avoid cast down the inheritance hierarchy.Model “has-a” or “is-implemented-in-
terms-of” through layering.
General GuidelinesGeneral Guidelines
Use multiple inheritance judiciously.
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 1
Base 1
f(); g();
Base 2
f(); h();
Derived
j(); k();
Derived d;
d.g(); // OK
d.h(); // OK
d.f(); // Ambiguous!!!
d.Base1::f(); // OK
d.Base2::f(); // OK
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 2
Left
int y;
Right
int z;
Bottom
int a
Top
int x;
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 2
Left
int y;
Right
int z;
Bottom
int a
Default inheritance mechanism -> maintains separate copies of the data members inherited from all base classes.
Top
int x;
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 2 (Non-virtual Base class)
Left
int y;
Right
int z;
Bottom
int a
Top
int x;
Top
int x; Top
int x;
Top
int x;
Left
int y;
Right
int z;
Bottom
int a
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 2 : Virtual Base Class
Left
int y;
Right
int z;
Bottom
int a
Top
int x;
virtual virtual
class Left::public virtual Top{…}class Right::public virtual Top{…}
Top
int x;Left
int y;
Right
int z;
Bottom
int a
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 2 : Virtual Base Class
Left
int y;
Right
int z;
Bottom
int a
Top
int x;
virtual virtual
Inherently ambiguous!!!
Ex) Bottom b;
b.x -> b.Left::x?
b.Right::x?
b.Top::x?
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 2 : Virtual Base Class
Left
int y;
Right
int z;
Bottom
int a
Top
int x;
virtual virtual
Assignment for Top::x happens twice.
- Bottom->Left->Top
- Bottom->Right->Top
Ambiguities under Multiple Ambiguities under Multiple InheritanceInheritance
Case 2 : Virtual Base Class
Left
int y;
Right
int z;
Bottom
int a
Top
int x;
virtual virtual
Assignment for Top::x happens twice.
- Bottom->Left->Top
- Bottom->Right->Top
Solution???
General GuidelinesGeneral Guidelines
Use multiple inheritance judiciously. Before using virtual base classes, understand them
thoroughly.– Use an experimental program to understand its
behavior. If a public base class does not have a virtual
destructor, no derived class should have a destructor.
If a multiple inheritance hierarchy has any destructors, every base class should have a virtual destructor.
General GuidelinesGeneral Guidelines
Declare a copy constructor and an assignment operator for classes with dynamically allocated memory.
Prefer initialization to assignment in constructors. List members in an initialization list in the order in
which they are declared. Make sure base classes have virtual destructors. Have operator= return a reference to *this. Assign to all data members in operator=. Check for assignment to self in operator=. Overloading vs. default argument.