#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEIgewoJdm9pZCBmKHN0ZDo6c3RyaW5nICYmIGEpe2NvdXQ8PCJCOjpmKHN0cmluZyAmJikiOyB9Cgl2aXJ0dWFsIGludCBmKCkgY29uc3QgewoJCWNvdXQgPDwgIkI6OmYoKSAgIjsgIHJldHVybiAwOyB9Cn07CnN0cnVjdCBEIDogQiB7CnZpcnR1YWwJdm9pZCBmKHN0ZDo6c3RyaW5nIGEpeyBjb3V0IDw8ICJEOjpmKHN0cmluZykgIjsgfQoJaW50IGYoKSBjb25zdCB7IGNvdXQgPDwgIkQ6OmYoKSAiOyByZXR1cm4gMDsgfQp9OwpzdHJ1Y3QgQyA6IEQgewoJdm9pZCBmKHN0ZDo6c3RyaW5nIGEpIG92ZXJyaWRlewoJCWNvdXQgPDwgIkM6OmYoc3RyaW5nKSAgIjsgfQoJaW50IGYoKSBjb25zdCBvdmVycmlkZSB7CgkJY291dCA8PCAiQzo6ZigpICI7ICByZXR1cm4gMDsgfQp9OwoKCmludCBtYWluKCkgewogICAgIEMgYzsKICAgICBEIGQ7CiAgICAgQiAqIHAgPSAmZDsKICAgICBEICogcSA9ICZjOwogICAgIHEgLT4gZigiMSIpOwogICAgIHEgLT4gZigpOwogICAgIHAgLT4gZigiMiIpOwogICAgIHAgLT4gZigpOwogICAgIHJldHVybiAwOwp9Cg==