// File: ex7-12.cpp
// This example shows that "virtualness" is passed down to derived classes
// even if the immediate "parent" class does not name a function as virtual.
// It also illustrates polymorphism implemented through references instead
// of pointers to base objects.
#include <iostream> #include <string> using namespace std; class person { public: virtual string who_am_i() const { return "person"; } string non_virtual_who_am_i() const { return "non_virtual person"; } }; class child : public person { public: string who_am_i() const { return "child"; } string non_virtual_who_am_i() const { return "non_virtual child"; } }; class grand_child : public child { public: string who_am_i() const { return "grand_child"; } string non_virtual_who_am_i() const { return "non_virtual grand_child"; } }; void identify_yourself(const person& p) { cout << "I am a " << (p.who_am_i()) << endl; cout << "I am a " << (p.non_virtual_who_am_i()) << endl; } int main() { person P; child C; grand_child G; person* pp; pp = &P; cout << (pp->who_am_i()) << endl; cout << (pp->non_virtual_who_am_i()) << endl; pp = &C; cout << (pp->who_am_i()) << endl; cout << (pp->non_virtual_who_am_i()) << endl; pp = &G; cout << (pp->who_am_i()) << endl; cout << (pp->non_virtual_who_am_i()) << endl; cout << "sizeof(person) = " << sizeof(person) << endl; cout << "sizeof(child) = " << sizeof(child) << endl; cout << "sizeof(grand_child) = " << sizeof(grand_child) << endl; identify_yourself(P); identify_yourself(C); identify_yourself(G); }