Я получил этот код в качестве примера использования двойной диспетчеризации, но я не совсем понимаю одну часть кода. создание «абстрактного класса» принтера, почему мне нужно добавить:
virtual void print(PDFDoc *d)=0;
virtual void print(DocDoc *d)=0;
Насколько я понимаю, во время выполнения p.print(docA);
отправит меня на virtual void print(Document *d)
myPrinter, затем d->printMe(this)
отправит меня на printMe из PDFDoc, а затем вызовет во время выполнения на virtual void print(PDFDoc *d)
моего принтера
Так зачем определять
virtual void print(PDFDoc *d)=0;
virtual void print(DocDoc *d)=0;
нужен для абстрактного класса?
class Document{
public:
//this is the accept function
virtual void printMe(Printer *p)=0;
};
class Printer{
public:
virtual void print(Document *d)=0;
//the visitors
virtual void print(PDFDoc *d)=0;
virtual void print(DocDoc *d)=0;
};
class PDFDoc : public virtual Document{
public:
virtual void printMe(Printer *p){
std::cout << "PDFDoc accepting a print call" << std::endl;
p->print(this);
}
};
class DocDoc : public virtual Document{
public:
virtual void printMe(Printer *p){
std::cout << "DocDoc accepting a print call" << std::endl;
p->print(this);
}
};
class MyPrinter : public virtual Printer{
public:
virtual void print(Document *d){
std::cout << "dispatching function <print> called" << std::endl;
d->printMe(this);
}
virtual void print(PDFDoc *d){
std::cout << "printing a PDF doc" << std::endl;
}
virtual void print(DocDoc *d){
std::cout << "printing a Doc doc" << std::endl;
}
};
int main(){
MyPrinter p;
Document *docA = new PDFDoc();
Document *docB = new DocDoc();
p.print(docA);
p.print(docB);
delete docA;
delete docB;
return 0;
}