#include <iostream>
#include <vector>
class Base;
class Derived1;
class Derived2;
class IBaseVisitor
{
public:
virtual ~IBaseVisitor() = default;
virtual void visit(Base&) = 0;
virtual void visit(Derived1&) = 0;
virtual void visit(Derived2&) = 0;
};
class Base
{
public:
Base() { std::cout << "Base::Base" << std::endl; }
virtual ~Base() { std::cout << "Base::~Base" << std::endl; }
virtual void accept(IBaseVisitor& v) { v.visit(*this); }
};
class Derived1 : public Base
{
public:
void func1() { std::cout << "Derived1::func1()" << std::endl; }
void accept(IBaseVisitor& v) override { v.visit(*this); }
};
class Derived2 : public Base
{
public:
void func2() { std::cout << "Derived2::func2()" << std::endl; }
void accept(IBaseVisitor& v) override { v.visit(*this); }
};
struct SomeFuncVisitor : IBaseVisitor
{
void visit(Base&) override { std::cout << "None" << std::endl; }
void visit(Derived1& d1) override { d1.func1(); }
void visit(Derived2& d2) override { d2.func2(); }
};
int main()
{
Derived1 derived1;
Derived2 derived2;
std::vector<Base *> vb {&derived1, &derived2};
SomeFuncVisitor visitor;
for (Base* base : vb) {
base->accept(visitor);
}
}