C++ Primer, Fifth Edition
Virtual functions that have default arguments should use the same argument
values in the base and derived classes.
Circumventing the Virtual Mechanism
In some cases, we want to prevent dynamic binding of a call to a virtual function; we
want to force the call to use a particular version of that virtual. We can use the scope
operator to do so. For example, this code:
Click here to view code image
//  calls the version from the base class regardless of the dynamic type of baseP
double undiscounted = baseP->Quote::net_price(42);
calls the Quote version of net_price regardless of the type of the object to which
baseP actually points. This call will be resolved at compile time.
Note
Ordinarily, only code inside member functions (or friends) should need to use
the scope operator to circumvent the virtual mechanism.
Why might we wish to circumvent the virtual mechanism? The most common reason
is when a derived-class virtual function calls the version from the base class. In such
cases, the base-class version might do work common to all types in the hierarchy. The
versions defined in the derived classes would do whatever additional work is particular
to their own type.
Warning
If a derived virtual function that intended to call its base-class version omits
the scope operator, the call will be resolved at run time as a call to the
derived version itself, resulting in an infinite recursion.
Exercises Section 15.3
Exercise 15.11: Add a virtual debug function to your Quote class hierarchy
that displays the data members of the respective classes.
Exercise 15.12: Is it ever useful to declare a member function as both
override and final? Why or why not?
www.it-ebooks.info
Convert pdf into ppt online - C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF in C#.net, ASP.NET MVC, WinForms, WPF
Online C# Tutorial for Creating PDF from Microsoft PowerPoint Presentation
convert pdf to powerpoint with; add pdf to powerpoint
Convert pdf into ppt online - VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to PDF in vb.net, ASP.NET MVC, WinForms, WPF
VB.NET Tutorial for Export PDF file from Microsoft Office PowerPoint
convert pdf slides to powerpoint online; how to add pdf to powerpoint presentation
C++ Primer, Fifth Edition
Exercise 15.13: Given the following classes, explain each print function:
Click here to view code image
class base {
public:
string name() { return basename; }
virtual void print(ostream &os) { os << basename; }
private:
string basename;
};
class derived : public base {
public:
void print(ostream &os) { print(os); os << " " << i; }
private:
int i;
};
If there is a problem in this code, how would you fix it?
Exercise 15.14: Given the classes from the previous exercise and the
following objects, determine which function is called at run time:
Click here to view code image
base bobj;     base *bp1 = &bobj;   base &br1 = bobj;
derived dobj;  base *bp2 = &dobj;   base &br2 = dobj;
(a) bobj.print();
(b) dobj.print();
(c) bp1->name();
(d) bp2->name();
(e) br1.print();
(f) br2.print();
15.4. Abstract Base Classes
Imagine that we want to extend our bookstore classes to support several discount
strategies. In addition to a bulk discount, we might offer a discount for purchases up
to a certain quantity and then charge the full price thereafter. Or we might offer a
discount for purchases above a certain limit but not for purchases up to that limit.
Each of these discount strategies is the same in that it requires a quantity and a
discount amount. We might support these differing strategies by defining a new class
named Disc_quote to store the quantity and the discount amount. Classes, such as
Bulk_item, that represent a specific discount strategy will inherit from Disc_quote.
Each of the derived classes will implement its discount strategy by defining its own
www.it-ebooks.info
Online Convert PowerPoint to PDF file. Best free online export
Convert a PPTX/PPT File to PDF. Just upload your file by clicking on the blue button or drag-and-drop your pptx or ppt file into the drop area.
how to convert pdf to ppt online; convert pdf to ppt
How to C#: Convert PDF, Excel, PPT to Word
How to C#: Convert PDF, Excel, PPT to Word. PDF, MS-Excel, MS-PPT to Word Conversion Overview. By integrating XDoc.Word SDK into your C#.NET project, PDF, MS
convert pdf file to powerpoint presentation; change pdf to powerpoint
C++ Primer, Fifth Edition
version of net_price.
Before we can define our Disc_Quote class, we have to decide what to do about
net_price. Our Disc_quote class doesn’t correspond to any particular discount
strategy; there is no meaning to ascribe to net_price for this class.
We could define Disc_quote without its own version of net_price. In this case,
Disc_quote would inherit net_price from Quote.
However, this design would make it possible for our users to write nonsensical code.
A user could create an object of type Disc_quote by supplying a quantity and a
discount rate. Passing that Disc_quote object to a function such as print_total
would use the Quote version of net_price. The calculated price would not include
the discount that was supplied when the object was created. That state of affairs
makes no sense.
Pure Virtual Functions
Thinking about the question in this detail reveals that our problem is not just that we
don’t know how to define net_price. In practice, we’d like to prevent users from
creating Disc_quote objects at all. This class represents the general concept of a
discounted book, not a concrete discount strategy.
We can enforce this design intent—and make it clear that there is no meaning for
net_price—by defining net_price as a pure virtual function. Unlike ordinary
virtuals, a pure virtual function does not have to be defined. We specify that a virtual
function is a pure virtual by writing = 0 in place of a function body (i.e., just before
the semicolon that ends the declaration). The = 0 may appear only on the declaration
of a virtual function in the class body:
Click here to view code image
// class to hold the discount rate and quantity
// derived classes will implement pricing strategies using these data
class Disc_quote : public Quote {
public:
Disc_quote() = default;
Disc_quote(const std::string& book, double price,
std::size_t qty, double disc):
Quote(book, price),
quantity(qty), discount(disc) { }
double net_price(std::size_t) const = 0;
protected:
std::size_t quantity = 0; //  purchase size for the discount to apply
double discount = 0.0;    //  fractional discount to apply
};
Like our earlier Bulk_item class, Disc_quote defines a default constructor and a
constructor that takes four parameters. Although we cannot define objects of this type
directly, constructors in classes derived from Disc_quote will use the Disc_quote
www.it-ebooks.info
How to C#: Convert Word, Excel and PPT to PDF
How to C#: Convert Word, Excel and PPT to PDF. MS Office to PDF Conversion Overview. By integrating XDoc.PDF SDK into your C#.NET project, Microsoft Office
online pdf converter to powerpoint; conversion of pdf into ppt
VB.NET PowerPoint: Convert & Render PPT into PDF Document
directly encode converted image source into PDF document file converted image source to PDF format, RasterEdge VB other encoding APIs to convert rendered image
convert pdf to powerpoint online; convert pdf file to powerpoint
C++ Primer, Fifth Edition
constructors to construct the Disc_quote part of their objects. The constructor that
has four parameters passes its first two to the Quote constructor and directly
initializes its own members, discount and quantity. The default constructor
default initializes those members.
It is worth noting that we can provide a definition for a pure virtual. However, the
function body must be defined outside the class. That is, we cannot provide a function
body inside the class for a function that is = 0.
Classes with Pure Virtuals Are Abstract Base Classes
A class containing (or inheriting without overridding) a pure virtual function is an
abstract base class. An abstract base class defines an interface for subsequent
classes to override. We cannot (directly) create objects of a type that is an abstract
base class. Because Disc_quote defines net_price as a pure virtual, we cannot
define objects of type Disc_quote. We can define objects of classes that inherit
from Disc_quote, so long as those classes override net_price:
Click here to view code image
// Disc_quote declares pure virtual functions, which Bulk_quote will override
Disc_quote discounted; // error: can't define a Disc_quote object
Bulk_quote bulk;       // ok: Bulk_quote has no pure virtual functions
Classes that inherit from Disc_quote must define net_price or those classes will
be abstract as well.
Note
We may not create objects of a type that is an abstract base class.
A Derived Class Constructor Initializes Its Direct Base Class Only
Now we can reimplement Bulk_quote to inherit from Disc_quote rather than
inheriting directly from Quote:
Click here to view code image
// the discount kicks in when a specified number of copies of the same book are sold
// the discount is expressed as a fraction to use to reduce the normal price
class Bulk_quote : public Disc_quote {
public:
Bulk_quote() = default;
Bulk_quote(const std::string& book, double price,
std::size_t qty, double disc):
Disc_quote(book, price, qty, disc) { }
www.it-ebooks.info
C# TIFF: Learn to Convert MS Word, Excel, and PPT to TIFF Image
C# TIFF - Conversion from Word, Excel, PPT to TIFF. In order to convert Microsoft Word, Excel, and PowerPoint to quiet easy to integrate this SDK into your C#
how to change pdf to powerpoint slides; convert pdf to powerpoint slide
VB.NET PowerPoint: Process & Manipulate PPT (.pptx) Slide(s)
to split one PPT (.pptx) document file into smaller sub control add-on can do PPT creating, loading powerful & profession imaging controls, PDF document, image
drag and drop pdf into powerpoint; convert pdf into ppt online
C++ Primer, Fifth Edition
// overrides the base version to implement the bulk purchase discount policy
double net_price(std::size_t) const override;
};
This version of Bulk_quote has a direct base class, Disc_quote, and an indirect
base class, Quote. Each Bulk_quote object has three subobjects: an (empty)
Bulk_quote part, a Disc_quote subobject, and a Quote subobject.
As we’ve seen, each class controls the initialization of objects of its type. Therefore,
even though Bulk_quote has no data members of its own, it provides the same
four-argument constructor as in our original class. Our new constructor passes its
arguments to the Disc_quote constructor. That constructor in turn runs the Quote
constructor. The Quote constructor initializes the bookNo and price members of
bulk. When the Quote constructor ends, the Disc_quote constructor runs and
initializes the quantity and discount members. At this point, the Bulk_quote
constructor resumes. That constructor has no further initializations or any other work
to do.
Key Concept: Refactoring
Adding Disc_quote to the Quote hierarchy is an example of 
refactoring.
Refactoring involves redesigning a class hierarchy to move operations and/or
data from one class to another. Refactoring is common in object-oriented
applications.
It is noteworthy that even though we changed the inheritance hierarchy,
code that uses Bulk_quote or Quote would not need to change. However,
when classes are refactored (or changed in any other way) we must
recompile any code that uses those classes.
Exercises Section 15.4
Exercise 15.15: Define your own versions of Disc_quote and
Bulk_quote.
Exercise 15.16: Rewrite the class representing a limited discount strategy,
which you wrote for the exercises in § 15.2.2 (p. 601), to inherit from
Disc_quote.
Exercise 15.17: Try to define an object of type Disc_quote and see what
errors you get from the compiler.
15.5. Access Control and Inheritance
www.it-ebooks.info
VB.NET PowerPoint: Read & Scan Barcode Image from PPT Slide
VB.NET PPT PDF-417 barcode scanning SDK to detect PDF-417 barcode Allow VB.NET developers to output PPT ISSN barcode scanning result into data string.
export pdf into powerpoint; change pdf to ppt
C# PDF Convert: How to Convert MS PPT to Adobe PDF Document
VB.NET Read: PDF Text Extract; VB.NET Read: PDF Image Extract; VB.NET Write: Insert text into PDF; C# PDF Convert: How to Convert MS PPT to Adobe PDF Document.
converting pdf to ppt; how to change pdf to powerpoint
C++ Primer, Fifth Edition
Just as each class controls the initialization of its own members (§ 15.2.2, p. 598),
each class also controls whether its members are accessible to a derived class.
protected Members
As we’ve seen, a class uses protected for those members that it is willing to share
with its derived classes but wants to protect from general access. The protected
specifier can be thought of as a blend of private and public:
• Like private, protected members are inaccessible to users of the class.
• Like public, protected members are accessible to members and friends of
classes derived from this class.
In addition, protected has another important property:
• A derived class member or friend may access the protected members of the
base class 
only
through a derived object. The derived class has no special
access to the protected members of base-class objects.
To understand this last rule, consider the following example:
Click here to view code image
class Base {
protected:
int prot_mem;     // protected member
};
class Sneaky : public Base  {
friend void clobber(Sneaky&);  // can access Sneaky::prot_mem
friend void clobber(Base&);    // can't access Base::prot_mem
int j;                          // j is private by default
};
// ok: clobber can access the private and protected members in Sneaky objects
void clobber(Sneaky &s) { s.j = s.prot_mem = 0; }
// error: clobber can't access the protected members in Base
void clobber(Base &b) { b.prot_mem = 0; }
If derived classes (and friends) could access protected members in a base-class
object, then our second version of clobber (that takes a Base&) would be legal.
That function is not a friend of Base, yet it would be allowed to change an object of
type Base; we could circumvent the protection provided by protected for any class
simply by defining a new class along the lines of Sneaky.
To prevent such usage, members and friends of a derived class can access the
protected members 
only
in base-class objects that are embedded inside a derived
type object; they have no special access to ordinary objects of the base type.
public, private, and protected Inheritance
www.it-ebooks.info
C++ Primer, Fifth Edition
Access to a member that a class inherits is controlled by a combination of the access
specifier for that member in the base class, and the access specifier in the derivation
list of the derived class. As an example, consider the following hierarchy:
Click here to view code image
class Base {
public:
void pub_mem();   // public member
protected:
int prot_mem;     // protected member
private:
char priv_mem;    // private member
};
struct Pub_Derv : public Base {
// ok: derived classes can access protected members
int f() { return prot_mem; }
// error: private members are inaccessible to derived classes
char g() { return priv_mem; }
};
struct Priv_Derv : private Base {
// private derivation doesn't affect access in the derived class
int f1() const { return prot_mem; }
};
The derivation access specifier has no effect on whether members (and friends) of a
derived class may access the members of its own direct base class. Access to the
members of a base class is controlled by the access specifiers in the base class itself.
Both Pub_Derv and Priv_Derv may access the protected member prot_mem.
Neither may access the private member priv_mem.
The purpose of the derivation access specifier is to control the access that 
users
of
the derived class—including other classes derived from the derived class—have to the
members inherited from Base:
Click here to view code image
Pub_Derv d1;   //  members inherited from Base are public
Priv_Derv d2;  //  members inherited from Base are private
d1.pub_mem();  //  ok: pub_mem is public in the derived class
d2.pub_mem();  //  error: pub_mem is private in the derived class
Both Pub_Derv and Priv_Derv inherit the pub_mem function. When the inheritance
is public, members retain their access specification. Thus, d1 can call pub_mem. In
Priv_Derv, the members of Base are private; users of that class may not call
pub_mem.
The derivation access specifier used by a derived class also controls access from
classes that inherit from that derived class:
www.it-ebooks.info
C++ Primer, Fifth Edition
Click here to view code image
struct Derived_from_Public : public Pub_Derv {
// ok: Base::prot_mem remains protected in Pub_Derv
int use_base() { return prot_mem; }
};
struct Derived_from_Private : public Priv_Derv {
// error: Base::prot_mem is private in Priv_Derv
int use_base() { return prot_mem; }
};
Classes derived from Pub_Derv may access prot_mem from Base because that
member remains a protected member in Pub_Derv. In contrast, classes derived
from Priv_Derv have no such access. To them, all the members that Priv_Derv
inherited from Base are private.
Had we defined another class, say, Prot_Derv, that used protected inheritance,
the public members of Base would be protected members in that class. Users of
Prot_Derv would have no access to pub_mem, but the members and friends of
Prot_Derv could access that inherited member.
Accessibility of Derived-to-Base Conversion
Whether the derived-to-base conversion (§ 15.2.2, p. 597) is accessible depends on
which code is trying to use the conversion and may depend on the access specifier
used in the derived class’ derivation. Assuming D inherits from B:
• User code may use the derived-to-base conversion 
only
if D inherits publicly
from B. User code may not use the conversion if D inherits from B using either
protected or private.
• Member functions and friends of D can use the conversion to B regardless of
how D inherits from B. The derived-to-base conversion to a direct base class is
always accessible to members and friends of a derived class.
• Member functions and friends of classes derived from D may use the derived-to-
base conversion if D inherits from B using either public or protected. Such
code may not use the conversion if D inherits privately from B.
Tip
For any given point in your code, if a public member of the base class
would be accessible, then the derived-to-base conversion is also accessible,
and not otherwise.
Key Concept: Class Design and protected Members
www.it-ebooks.info
C++ Primer, Fifth Edition
In the absence of inheritance, we can think of a class as having two different
kinds of users: ordinary users and implementors. Ordinary users write code
that uses objects of the class type; such code can access only the public
(interface) members of the class. Implementors write the code contained in
the members and friends of the class. The members and friends of the class
can access both the public and private (implementation) sections.
Under inheritance, there is a third kind of user, namely, derived classes. A
base class makes protected those parts of its implementation that it is
willing to let its derived classes use. The protected members remain
inaccessible to ordinary user code; private members remain inaccessible to
derived classes and their friends.
Like any other class, a class that is used as a base class makes its interface
members public . A class that is used as a base class may divide its
implementation into those members that are accessible to derived classes and
those that remain accessible only to the base class and its friends. An
implementation member should be protected if it provides an operation or
data that a derived class will need to use in its own implementation.
Otherwise, implementation members should be private.
Friendship and Inheritance
Just as friendship is not transitive (§7.3.4, p. 279), friendship is also not inherited.
Friends of the base have no special access to members of its derived classes, and
friends of a derived class have no special access to the base class:
Click here to view code image
class Base {
// added friend declaration; other members as before
friend class Pal; // Pal has no access to classes derived from Base
};
class Pal {
public:
int f(Base b) { return b.prot_mem; } // ok: Pal is a friend of
Base
int f2(Sneaky s) { return s.j; } // error: Pal not friend of
Sneaky
// access to a base class is controlled by the base class, even inside a derived
object
int f3(Sneaky s) { return s.prot_mem; } // ok: Pal is a friend
};
The fact that f3 is legal may seem surprising, but it follows directly from the notion
www.it-ebooks.info
C++ Primer, Fifth Edition
that each class controls access to its own members. Pal is a friend of Base, so Pal
can access the members of Base objects. That access includes access to Base
objects that are embedded in an object of a type derived from Base.
When a class makes another class a friend, it is only that class to which friendship is
granted. The base classes of, and classes derived from, the friend have no special
access to the befriending class:
Click here to view code image
// D2 has no access to protected or private members in Base
class D2 : public Pal {
public:
int mem(Base b)
{ return b.prot_mem; } // error: friendship doesn't inherit
};
Note
Friendship is not inherited; each class controls access to its members.
Exempting Individual Members
Sometimes we need to change the access level of a name that a derived class
inherits. We can do so by providing a using declaration (§3.1, p. 82):
Click here to view code image
class Base {
public:
std::size_t size() const { return n; }
protected:
std::size_t n;
};
class Derived : private Base {    //  note: private inheritance
public:
// maintain access levels for members related to the size of the object
using Base::size;
protected:
using Base::n;
};
Because Derived uses private inheritance, the inherited members, size and n,
are (by default) private members of Derived. The using declarations adjust the
accessibility of these members. Users of Derived can access the size member, and
classes subsequently derived from Derived can access n.
A using declaration inside a class can name any accessible (e.g., not private)
www.it-ebooks.info
Documents you may be interested
Documents you may be interested