Skip to content

Instantly share code, notes, and snippets.

@berkus
Last active December 23, 2015 06:29
Show Gist options
  • Save berkus/6594822 to your computer and use it in GitHub Desktop.
Save berkus/6594822 to your computer and use it in GitHub Desktop.
Final version of the virtual classes gist, working.
#include <iostream>
using namespace std;
class Button
{
protected:
class Border {
public:
using Color = int;
virtual void draw() = 0;
Color getBaseColor();
};
class FlatBorder : public Border {
public:
void draw() override {
cout << "Button::FlatBorder::draw()" << endl;
}
};
class PushedBorder : public Border {
public:
void draw() override {
cout << "Button::PushedBorder::draw()" << endl;
}
};
// factories...
virtual unique_ptr<Border> createFlatBorder() {
return unique_ptr<Border>(new FlatBorder());
}
virtual unique_ptr<Border> createPushedBorder() {
return unique_ptr<Border>(new PushedBorder());
}
private:
unique_ptr<Border> border_;
void setBorder(unique_ptr<Border> border) {
border_ = std::move(border);
}
public:
void push() {
setBorder(createPushedBorder());
}
void release() {
setBorder(createFlatBorder());
}
void draw() {
border_->draw();
}
};
class MyButton : public Button
{
class PushedBorder : public Border
{
public:
void draw() override {
cout << "MyButton::PushedBorder::draw()" << endl;
}
};
unique_ptr<Border> createPushedBorder() override {
return unique_ptr<Border>(new PushedBorder());
}
};
int main()
{
MyButton button;
button.push();
button.draw();// Does actually output MyButton::PushedBorder::draw()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment