#include <iostream>

class Example {
    public:
        Example() = default;
        
        virtual void virt_func() { 
        	std::cout << "Example virt_func" << std::endl;
        }
        
        void nonvirt_func() {
        	std::cout << "Example nonvirt_func" << std::endl; 
        }
};

class Child: public Example {
    public:
    	Child() = default;
    
        void virt_func() {
        	std::cout << "Child virt_func" << std::endl;
        }
        
        void nonvirt_func() {
        	std::cout << "Child nonvirt_func" << std::endl; 
        }
};

int main() {
	Child c;
	std::cout << "On Child instance:" << std::endl;
	c.virt_func();
	c.nonvirt_func();
	
	Example& e1 = c;
	std::cout << "\nOn Example& casted from c:" << std::endl;
	e1.virt_func();
	e1.nonvirt_func();
	
	Example e2 = c;
	std::cout << "\nOn Example instance constructed from c:" << std::endl;
	e2.virt_func();
	e2.nonvirt_func();
}