Skip to content

Instantly share code, notes, and snippets.

@stungeye
Last active February 13, 2023 17:40
Show Gist options
  • Save stungeye/c6eee739087cfe4f0f36b91e723cb834 to your computer and use it in GitHub Desktop.
Save stungeye/c6eee739087cfe4f0f36b91e723cb834 to your computer and use it in GitHub Desktop.
Base and Derived CPP Classes
#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