#include <cassert>
#include <functional>

using namespace std;

class Child;
class Parent
{
public:
	virtual ~Parent() {}

	function<void()> funcPointer;
	function<void(Parent*)> funcPointer2;
	void (Child::*funcPointer3)();
};

class Child : public Parent
{
public:
	void TestFunc() {

	}
	void Do() {
		funcPointer = bind(&Child::TestFunc, this);
		funcPointer2 = [](Parent* arg) { 
			assert(dynamic_cast<Child*>(arg) != nullptr);
			
			static_cast<Child*>(arg)->TestFunc();
		};
		funcPointer3 = &Child::TestFunc;
		funcPointer();
		funcPointer2(this);
		(this->*funcPointer3)();
	}
};

int main() {}