#include <iostream>
#include <memory>
struct LoggerInterface {};
std::shared_ptr<LoggerInterface> pi = std::make_shared<LoggerInterface>();
struct B {
virtual void foo(int blablabla, std::shared_ptr<LoggerInterface> logger = nullptr) = 0;
};
struct D : B {
void foo(int blablabla, std::shared_ptr<LoggerInterface> logger) override {
std::cout << "foo: "<<blablabla<<" "<< logger<<std::endl;
}
};
struct E : B {
void foo(int blablabla, std::shared_ptr<LoggerInterface> logger = pi) override {
std::cout << "foo: "<<blablabla<<" "<< logger<<std::endl;
}
};
int main() {
D d;
B *b=&d;
b->foo(15);
//d.foo(15);
E e;
e.foo(16);
B *b2 = &e;
b2->foo(16);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IExvZ2dlckludGVyZmFjZSB7fTsgCgpzdGQ6OnNoYXJlZF9wdHI8TG9nZ2VySW50ZXJmYWNlPiBwaSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TG9nZ2VySW50ZXJmYWNlPigpOyAKCnN0cnVjdCBCIHsKCXZpcnR1YWwgdm9pZCBmb28oaW50IGJsYWJsYWJsYSwgc3RkOjpzaGFyZWRfcHRyPExvZ2dlckludGVyZmFjZT4gbG9nZ2VyID0gbnVsbHB0cikgPSAwOwp9OwpzdHJ1Y3QgRCA6IEIgewogICAgdm9pZCBmb28oaW50IGJsYWJsYWJsYSwgc3RkOjpzaGFyZWRfcHRyPExvZ2dlckludGVyZmFjZT4gbG9nZ2VyKSBvdmVycmlkZSB7CiAgICAJc3RkOjpjb3V0IDw8ICJmb286ICI8PGJsYWJsYWJsYTw8IiAiPDwgbG9nZ2VyPDxzdGQ6OmVuZGw7IAogICAgfQp9OwoKc3RydWN0IEUgOiBCIHsKICAgIHZvaWQgZm9vKGludCBibGFibGFibGEsIHN0ZDo6c2hhcmVkX3B0cjxMb2dnZXJJbnRlcmZhY2U+IGxvZ2dlciA9IHBpKSBvdmVycmlkZSB7CiAgICAJc3RkOjpjb3V0IDw8ICJmb286ICI8PGJsYWJsYWJsYTw8IiAiPDwgbG9nZ2VyPDxzdGQ6OmVuZGw7IAogICAgfQp9OwoKaW50IG1haW4oKSB7CglEIGQ7IAoJQiAqYj0mZDsKCWItPmZvbygxNSk7IAoJLy9kLmZvbygxNSk7CglFIGU7IAoJCgllLmZvbygxNik7IAoJQiAqYjIgPSAmZTsgCgliMi0+Zm9vKDE2KTsKCQoJcmV0dXJuIDA7Cn0=