#include <memory>
#include <iostream>
#include <ostream>

class BaseClass
{
public:
	int a;
	virtual ~BaseClass() {};

	bool operator==( const BaseClass& right ) const
	{
		return typeid(*this) == typeid(right) && 
			   a == right.a;
	}
};

class DerivedClass : public BaseClass
{
public:
	int x;

	bool operator==( const DerivedClass& right ) const
	{
		return BaseClass::operator==(right) && 
			   x == right.x;
	}
};

int main()
{
	auto obj = std::make_shared<BaseClass>();
	auto obj2 = std::make_shared<BaseClass>();
	obj->a = 100;
	obj2->a = 100;
	auto result = *obj == *obj2;
	std::cout << "1: BaseClass(100) == BaseClass(100): " << result << std::endl;

	obj2->a = 1000;
	result = *obj == *obj2;
	std::cout << "2: BaseClass(100) == BaseClass(1000): " << result << std::endl;

	obj2 = std::make_shared<DerivedClass>();
	result = *obj == *obj2;
	std::cout << "3: BaseClass == DerivedClass: " << result << std::endl;
}