Last active
February 13, 2023 17:40
-
-
Save stungeye/c6eee739087cfe4f0f36b91e723cb834 to your computer and use it in GitHub Desktop.
Base and Derived CPP Classes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
class Base { | |
protected: | |
int value; // Derived class will have access. | |
public: | |
Base(int value) : value{value} { | |
std::cout << "Base Constructor\n"; | |
} | |
virtual ~Base() {} // Sets up the Base as having polymorphic relationship with Derived | |
int getValue() const { | |
return value; | |
} | |
std::string getName() const { | |
return "Base"; | |
} | |
}; | |
class Derived : public Base { | |
double age; | |
public: | |
Derived(int value, double age) : Base{ value }, age{ age } // equivalent of super(value) | |
{ | |
std::cout << "Derived Constructor\n"; | |
} | |
std::string getName() const { | |
return "Derived"; | |
} | |
int getDoubleValue() const { | |
return value * 2; | |
} | |
double getAge() const { | |
return age; | |
} | |
}; | |
int main() | |
{ | |
Base myBase{ 25 }; | |
Derived myDerived{ 33, 25.3 }; | |
std::cout << "## ACCESSING Base myBase\n"; | |
std::cout << myBase.getName() << " : " << myBase.getValue() << "\n"; | |
std::cout << "## ACCESSING Derived myDerived\n"; | |
std::cout << myDerived.getName() << " : " << myDerived.getValue(); | |
std::cout << " : " << myDerived.getAge() << " : " << myDerived.getDoubleValue() << "\n"; | |
Derived& derivedRef{ myDerived }; | |
std::cout << "## ACCESSING Derived& derivedRef{myDerived}\n"; | |
std::cout << derivedRef.getName() << " : " << derivedRef.getValue(); | |
std::cout << " : " << derivedRef.getAge() << " : " << derivedRef.getDoubleValue() << "\n"; | |
Derived* derivedPointer{ &myDerived }; | |
std::cout << "## ACCESSING Derived* derivedPointer{&myDerived}\n"; | |
std::cout << derivedPointer->getName() << " : " << derivedPointer->getValue(); | |
std::cout << " : " << derivedPointer->getAge() << " : " << derivedPointer->getDoubleValue() << "\n"; | |
Base& baseRefToBase{ myBase }; | |
Base& baseRefToDerived{ myDerived }; | |
Base* basePointerToDerived{ &myDerived }; | |
std::cout << "## ACCESSING Base& baseRefToBase{ myBase }\n"; | |
std::cout << baseRefToBase.getName() << " : " << baseRefToBase.getValue() << "\n"; | |
std::cout << "## ACCESSING Base& baseRefToDerived{ myDerived }\n"; | |
std::cout << baseRefToDerived.getName() << " : But actually I'm a: " | |
<< dynamic_cast<Derived&>(baseRefToDerived).getName() | |
<< " : " << dynamic_cast<Derived&>(baseRefToDerived).getAge() << "\n"; | |
std::cout << "## ACCESSING Base* basePointerToDerived{ &myDerived }\n"; | |
std::cout << basePointerToDerived->getName() << " : But actually I'm a: " | |
<< dynamic_cast<Derived*>(basePointerToDerived)->getName() | |
<< " : " << dynamic_cast<Derived*>(basePointerToDerived)->getAge() << "\n"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment