struct data
{
	char c[100];
};

class view
{
public:
	view(data d) :
		first(&d.c[0]),
		last(&d.c[100])
	{
		
	}
private:
	char * first;
	char * last;
};

class data_interface
{
	virtual view get_view() = 0;
};

class base_owns_data : public data_interface
{
public:
	view get_view() override
	{
		return view(d);
	}
	
private:
	data d;
};

view some_process(base_owns_data *b)
{
	auto working_view = b->base_owns_data::get_view();
	// Do a bunch of things to filter the view
	return working_view;
}

class derived_owns_data : public base_owns_data
{
public:
	base_owns_data * as_base()
	{
		return this;
	}

	view get_view() override
	{
		return some_process(this->as_base());	
	}
};


int main() {
	derived_owns_data d;
	d.get_view();
	return 0;
}