Реализация иерархии шаблона посетителя в переполнении стека

У меня есть структура класса, определенная так:

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 сделать что-нибудь с моей структурой класса), и они не могли вызвать посетителя на базовый тип.
Извините за мой плохой английский и спасибо в совете за ваши ответы.

0

Решение

От: http://www.cplusplus.com/doc/tutorial/polymorphism/

Dog dog;
Pet* pet = &dog;

ConcreteVisitor v;
pet->accept(v)
1

Другие решения

Что-то вроде этого:

Dog dog;
Pet& pet = dog;

ConcreteVisitor cv;
Visitor& v = cv;

pet.accept(v);
0

По вопросам рекламы [email protected]