Метод, который может быть вызван только при обращении к базовому классу?C ++ - PullRequest
2 голосов
/ 26 августа 2010

Скажите, у меня есть абстрактный класс

class NecessaryDanger
{
public:
     virtual void doSomethingDangerous() =0;
}

и класс, производный от этого класса:

class DoesOtherStuff : public NecessaryDanger
{
     //stuff
     void otherMethod();
     void doSomethingDangerous();
}

есть ли способ, которым я могу разрешить доступ только к doSomethingDangerous (), например

DoesOtherStuff d;
d = DoesOtherStuff();
d.otherMethod(); //OK
d.doSomethingDangerous(); //error

NecessaryDanger* n = &d;
n->doSomethingDangerous(); //OK

Я пока не очень хорош в C ++, поэтому приведенный выше код может быть не совсем правильным, но вы, возможно, поняли идею. У меня есть набор классов, которые должны иметь возможность делать «что-то опасное» (по-своему), что может вызвать проблемы, если более чем один объект из этих классов делает эту опасную вещь. Я хотел бы иметь класс менеджера, который имеет указатель NeededDanger только на один объект. Если бы метод doSomethingDangerous мог быть вызван только объектом NeededDanger, случайному вызову doSomethingDangerous было бы сложнее произойти и вызвать у меня головную боль в будущем.

Заранее спасибо за помощь. Извините заранее, если это глупый вопрос!

Ответы [ 3 ]

4 голосов
/ 26 августа 2010

Конечно. Просто сделайте его private в производном классе и public в базе.

Конечно, если NecessaryDanger является публичной базой, тогда любой может разыграть и коллировать. Возможно, вы захотите сделать его частной базой и использовать friend.

class DoesOtherStuff : private NecessaryDanger
{
     //stuff
     void otherMethod();

private:
     void doSomethingDangerous();

     friend class DangerManager;
}
2 голосов
/ 26 августа 2010

Удалите классификатор virtual в суперклассе, чтобы компилятор выполнял привязку во время компиляции на основе типа переменной вместо привязки во время выполнения на основе типа объекта.

0 голосов
/ 26 августа 2010

Опираясь на ответ Потсвоттера:)

Здесь - это совет Херба (особенно 1 и 2), применимый в этом контексте.

Инструкция № 1: Предпочитаю делать интерфейсы не виртуальные, используя Template Метод.
Руководство № 2: Предпочитаю делать виртуальные функции приватные.
Рекомендация № 3: Только если производные классы должны вызывать базовую реализацию виртуальная функция, сделать виртуальный функция защищена.

Для особого случая деструктора только:

Рекомендация № 4: Деструктор базового класса должен быть публичным и виртуальным, или защищенный и не виртуальный.

...