Skip to content

Instantly share code, notes, and snippets.

@berkus
Created September 17, 2013 14:03
Show Gist options
  • Save berkus/6594742 to your computer and use it in GitHub Desktop.
Save berkus/6594742 to your computer and use it in GitHub Desktop.
Original, non-working sketch of virtual classes base on examples in CaesarJ http://caesarj.org/index.php/ProgrammingGuide/VirtualClasses
#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;
}
};
private:
unique_ptr<Border> border_;
void setBorder(unique_ptr<Border> border) {
border_ = std::move(border);
}
public:
void push() {
setBorder(unique_ptr<Border>(new PushedBorder()));
}
void release() {
setBorder(unique_ptr<Border>(new FlatBorder()));
}
void draw() {
border_->draw();
}
};
class MyButton : public Button
{
class PushedBorder : public Border
{
public:
void draw() override {
cout << "MyButton::PushedBorder::draw()" << endl;
}
};
};
int main()
{
MyButton button;
button.push();
button.draw();// Should output MyButton::PushedBorder::draw()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment