#include <iostream>
using namespace std;


struct B {
	void f(int && a){
		cout << "B::f(int&&)  "; }
	virtual int f() const {
		cout << "B::f() "; return 0;}
};
struct D : B {
	virtual void f(int a){
		cout << "D::f(int)  "; }
	virtual int f()const  {
		cout << "D::f() "; return 0;}
};
struct C : D {
	void f(int a)  {
		cout << "C::f(int)  "; }
	int f() const  {
		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;
   }
