#include <iostream>
using namespace std;

struct B {
	void f(std::string && a){cout<<"B::f(string &&)"; }
	virtual int f() const {
		cout << "B::f()  ";  return 0; }
};
struct D : B {
virtual	void f(std::string a){ cout << "D::f(string) "; }
	int f() const { cout << "D::f() "; return 0; }
};
struct C : D {
	void f(std::string a) override{
		cout << "C::f(string)  "; }
	int f() const override {
		cout << "C::f() ";  return 0; }
};


int main() {
     C c;
     D d;
     B * p = &d;
     D * q = &c;
     q -> f("1");
     q -> f();
     p -> f("2");
     p -> f();
     return 0;
}
