class Base
{
// Note: You can make this protected, but then you need `friend class Common;` in A, B.
public:
int x, y;
};
struct Common
{
// Hide implementation details here, has access data of type T
// (only public stuff can be accessed, unless Common is a friend of T!)
template <class T>
int sum(T *_this) const {
return _this->x + _this->y;
}
};
class A : public Base, private Common
{
public:
// Only forward to the actual implementation in Common
int sum() const { return Common::sum(this); }
};
class B : public Base, private Common
{
public:
// Only forward to the actual implementation in Common
int sum() const { return Common::sum(this); }
};
int main() {
return 0;
}
Y2xhc3MgQmFzZQp7CiAgICAvLyBOb3RlOiBZb3UgY2FuIG1ha2UgdGhpcyBwcm90ZWN0ZWQsIGJ1dCB0aGVuIHlvdSBuZWVkIGBmcmllbmQgY2xhc3MgQ29tbW9uO2AgaW4gQSwgQi4KcHVibGljOgogICAgaW50IHgsIHk7Cn07CgpzdHJ1Y3QgQ29tbW9uCnsKICAgIC8vIEhpZGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBoZXJlLCBoYXMgYWNjZXNzIGRhdGEgb2YgdHlwZSBUCiAgICAvLyAob25seSBwdWJsaWMgc3R1ZmYgY2FuIGJlIGFjY2Vzc2VkLCB1bmxlc3MgQ29tbW9uIGlzIGEgZnJpZW5kIG9mIFQhKQogICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICBpbnQgc3VtKFQgKl90aGlzKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIF90aGlzLT54ICsgX3RoaXMtPnk7CiAgICB9Cn07CgpjbGFzcyBBIDogcHVibGljIEJhc2UsIHByaXZhdGUgQ29tbW9uCnsKcHVibGljOgogICAgLy8gT25seSBmb3J3YXJkIHRvIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gaW4gQ29tbW9uCiAgICBpbnQgc3VtKCkgY29uc3QgeyByZXR1cm4gQ29tbW9uOjpzdW0odGhpcyk7IH0KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQmFzZSwgcHJpdmF0ZSBDb21tb24KewpwdWJsaWM6CiAgICAvLyBPbmx5IGZvcndhcmQgdG8gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBpbiBDb21tb24KICAgIGludCBzdW0oKSBjb25zdCB7IHJldHVybiBDb21tb246OnN1bSh0aGlzKTsgfQp9OwoKCmludCBtYWluKCkgewogICAgcmV0dXJuIDA7Cn0=