Допустим, у меня есть следующие иерархии классов:добавив метод производного класса и вызова из базового указателя
class A
{
public:
virtual ~A();
};
class B : public A
{};
class AUser
{
public:
virtual ~AUser();
protected:
A* m_pA;
};
class BUser : public AUser
{};
Теперь я хочу добавить метод B
который не имеет отношение к A
и будет называться только от BUser
.
class B : public A
{
public:
void addedFunctionality()
{
// do something
}
};
Для вызова добавлен метод У меня есть два варианта:
Добавить пустой метод A:
class A { public: virtual ~A(); void addedFunctionality() { // do nothing } }; class BUser : public AUser { void useB() { m_pA->addedFunctionality(); } };
вызов добавленный метод с использованием опущенными:
class BUser : public AUser { void useB() { static_cast<B*>(m_pA)->addedFunctionality(); } };
Я знаю, что нужно избегать осколков, но мне не нравится первый вариант, так как он раздувает код A
без причины.
Есть ли другая альтернатива дизайна?
Может 'BUser' также "быть"' B'? (например, 'class B: virtual public A {void addedFunctionality() {}};' then 'class BUser: virtual public AUser, virtual public B' ..? – txtechhelp
no,' BUser' - это просто пользователь, а не служба. –
Во-первых, если вы не знаете, что у вас есть 'B', вы должны использовать' dynamic_cast' вместо 'static_cast'. Однако, если вы это знаете, вы можете также сохранить указатель на' B' для начала. Кроме того, вы можете использовать шаблон посетителя. Кроме того, сложно предложить вещи, не зная, что происходит. –