#include using namespace std; class BaseT { public: BaseT() { cout << "In the base constructor" << endl; } // don't worry about this now virtual ~BaseT() = default; virtual string Greeting() { return "Base Class Hello!"; } int GetBaseData(void) const { return baseData; } void SetBaseData(int data) { baseData = data; } int GetClassData(void) const { cout << "From the base class " ; return classData; } void SetClassData(int data) { classData = data; } protected: int classData{1}; private: int baseData{1}; }; class DerivedT : public BaseT { public: DerivedT(): BaseT() { cout << "In the derived class constructor " << endl; } string Greeting() override { return BaseT::Greeting() + " and the derived class too!"; } int GetClassData(void) const { cout << "From the derived class "; return BaseT::GetClassData(); } void DoubleBaseData() { // baseData *=2; int data = GetBaseData(); data *= 2; SetBaseData(data); } void DoubleClassData() { classData *= 2; } int GetDerivedData(void) const { return derivedData; } void SetDerivedData(int data) { derivedData = data; } private: int derivedData{1}; }; void BlabAbout(string name, BaseT * basePtr) { DerivedT * ptr{nullptr}; cout << "Talking about " << name << endl; cout << "\t" << basePtr->Greeting() << endl; cout << "\tbaseData " << basePtr->GetBaseData() << endl; cout << "\tclassData " << basePtr->GetClassData() << endl; ptr = dynamic_cast (basePtr); //if (nullptr != (ptr = dynamic_cast (basePtr))) { if (nullptr != ptr ) { cout << "\tThis is a derived class!" << endl; cout << "\tderivedData " << ptr->GetDerivedData() << endl; cout << "\tDoubling down " << endl; cout <<"\t" << endl; ptr->DoubleBaseData(); ptr->DoubleClassData(); cout << "\tbaseData " << ptr->GetBaseData() << endl; cout << "\tclassData " << ptr->GetClassData() << endl; } return; } void BlabAbout2(string name, BaseT & baseRef) { cout << "Talking about " << name << endl; cout << "\t" << baseRef.Greeting() << endl; /* cout << "\tbaseData " << baseRef.GetBaseData() << endl; cout << "\tclassData " << baseRef.GetClassData() << endl; try { DerivedT & derivedRef = dynamic_cast (baseRef); cout << "\tThis is a derived class!" << endl; cout << "\tderivedData " << derivedRef.GetDerivedData() << endl; cout << "\tDoubling down " << endl; cout <<"\t" << endl; derivedRef.DoubleBaseData(); derivedRef.DoubleClassData(); cout << "\tbaseData " << derivedRef.GetBaseData() << endl; cout << "\tclassData " << derivedRef.GetClassData() << endl; } catch (std::bad_cast & e) { cout << "\tCould not convert " << name << " to a DerivedT" <(&baseRef)) { DynamicT & dynamicRef = dynamic_cast (baseRef); } */ return; } int main() { BaseT a; DerivedT b; /* cout << "Dealing with A" << endl; a.SetBaseData(4); a.SetClassData(29); cout << "a's data is " << a.GetBaseData() << " " << a.GetClassData() << endl; b.SetBaseData(99); b.SetClassData(200); b.SetDerivedData(122); cout << "b's data is " << b.GetBaseData() << " " << b.GetClassData() << " " << b.GetDerivedData() << endl; cout << endl << endl; BlabAbout("a", &a); BlabAbout("b", &b); cout << endl<< endl; */ BlabAbout2("a", a); BlabAbout2("b", b); return 0; }