#include <iostream>
#include <exception>
#include <vector>
#include <string>
#include <iterator>
#include <algorithm>

class base
{
public:
	base() = default;
	virtual ~base() = default;

	void func()
	{
		std::cout << "base" << std::endl;
	}

	virtual void g()
	{
		std::cout << "base::g" << std::endl;
	}
};

class derived : public base
{
public:
	void func()
	{
		std::cout << "derived" << std::endl;
	}

	void g() override
	{
		std::cout << "derived::g" << std::endl;
	}

	void e()
	{
		std::cout << "derived:e" << std::endl;
	}
};

void st(void)
{
	static int x = 1;
	std::cout << x << std::endl;
	++x;
}

int main()
{
	base b;
	derived d;

	base& bRef = b;
	base& dRef = d;

	bRef.g();
	dRef.g();

	static_cast<derived&>(bRef).e();

	return 0;
}