Первый класс:
class Paragraph
{
public:
Paragraph(const string& inInitialText) : mText(inInitialText) {}
virtual string getHTML() const { return mText; }
protected:
string mText;
};
Второй класс:
class BoldParagraph : public Paragraph
{
public:
BoldParagraph(const Paragraph& inParagraph) : Paragraph(""), mWrapped(inParagraph) {}
virtual string getHTML() const { return "<B>" + mWrapped.getHTML() + "</B>"; }
protected:
const Paragraph& mWrapped;
};
третий класс:
class ItalicParagraph : public Paragraph
{
public:
ItalicParagraph(const Paragraph& inParagraph) : Paragraph(""), mWrapped(inParagraph) {}
virtual string getHTML() const { return "<I>" + mWrapped.getHTML() + "</I>"; }
protected:
const Paragraph& mWrapped;
};
Main:
int main(int argc, char** argv)
{
Paragraph p("Текст");
cout<<BoldParagraph(p).getHTML()<<endl;
cout<<ItalicParagraph(BoldParagraph(p)).getHTML()<<endl;
cout<<BoldParagraph(BoldParagraph(p)).getHTML()<<endl;
}
Вывод:
<B>Текст</B>
<I><B>Текст</B></I>
<B>Текст</B>
Видим, что третий вывод не содержит удвоения тегов.
"Если вы понимаете причину такого "явления", значит, вы освоили С++!" - будоражащие слова из книги)