У меня есть структура класса, определенная так:
class Pet {};
class Dog : Pet {};
class Cat : Pet {};
В этой структуре классов я реализую шаблон дизайна посетителя, с чем-то вроде этого:
class Pet {
virtual void Accept(Visitor& v) {
v.visit(this);
}
};
class Dog : Pet {
virtual void Accept(Visitor& v) {
v.visit(this);
}
};
class Cat : Pet {
virtual void Accept(Visitor& v) {
v.visit(this);
}
};
class Visitor {
virtual void visit(Pet*)=0;
virtual void visit(Dog*)=0;
virtual void visit(Cat*)=0;
};
class ConcreteVisitor : Visitor {
virtual void visit(Pet*) {
std::cout<<"Pet"<<std::endl;
}
virtual void visit(Dog*) {
std::cout<<"Dog"<<std::endl;
}
virtual void visit(Cat*) {
std::cout<<"Cat"<<std::endl;
}
};
Со структурой класса, определенной следующим образом, если я напишу вызов, например,
Dog dog;
ConcreteVisitor v;
dog.accept(v);
Будет печатать dog
, Теперь мой вопрос: как я могу позвонить посетителю на Pet
класс (базовый класс) после печати собаки? Мне нужно сделать это без явный вызов его в классе ConcreteVisitor. Я делаю это, потому что реализация Visitor (например, ConcreteVisitor) для меня неуправляема (кто использует мой код, расширяет Visitor
сделать что-нибудь с моей структурой класса), и они не могли вызвать посетителя на базовый тип.
Извините за мой плохой английский и спасибо в совете за ваши ответы.
От: http://www.cplusplus.com/doc/tutorial/polymorphism/
Dog dog;
Pet* pet = &dog;
ConcreteVisitor v;
pet->accept(v)
Что-то вроде этого:
Dog dog;
Pet& pet = dog;
ConcreteVisitor cv;
Visitor& v = cv;
pet.accept(v);