Архитектура наследования классов C ++ - предотвращение приведения - PullRequest
0 голосов
/ 08 апреля 2010

У меня есть структура базового класса и пара унаследованных классов. Базовый класс должен быть чисто виртуальным классом, он должен предотвращать создание экземпляров. Унаследованные классы могут быть созданы. Пример кода ниже:

class BaseClass
{
public:
    BaseClass(void);
    virtual ~BaseClass(void) = 0;
};

class InheritedClass : public BaseClass
{
public:
    InheritedClass1(void);
    ~InheritedClass1(void);
};

class DifferentInheritedClass : public BaseClass
{
public:
    DifferentInheritedClass(void);
    ~DifferentInheritedClass(void);
};

Я хочу предотвратить выполнение следующих операций:

InheritedClass *inherited1 = new InheritedClass();

DifferentInheritedClass *inherited2 = new DifferentInheritedClass ();

BaseClass *base_1 = inherited1;
BaseClass *base_2 = inherited2;

*base_1 = *base_2;

Ответы [ 5 ]

10 голосов
/ 08 апреля 2010

Сделать конструктор копирования и оператор присваивания в BaseClass защищенными. Класс уже не может быть создан, поэтому вам не нужны общедоступные операторы копирования и конструирования. С помощью конструктора защищенного копирования и операторов присваивания вы можете вызывать его из конструкторов производных классов и операторов присваивания.

2 голосов
/ 08 апреля 2010

Вы не можете запретить другим программистам использовать приведение. Они могут свободно интерпретировать ваш макет памяти, как пожелают, с помощью reinterpret_cast или приведения в стиле C, хотя это вызывает неопределенное поведение.

EDIT: Как сказал sharptooth, вы можете сделать конструктор копирования базового класса защищенным, чтобы избежать некоторых подобных проблем.

1 голос
/ 08 апреля 2010

Вы можете предотвратить *base_1 = *base_2, сделав оператор присваивания BaseClass защищенным, но вы не можете предотвратить base_1 = base_2.

0 голосов
/ 08 апреля 2010

Если вы можете использовать Boost C ++ Libs, тогда вы можете использовать базовый класс boost :: non_copyable. Или, как написано выше, вы можете объявить необходимые операции защищенными, например, конструктор копирования или оператор присваивания.

0 голосов
/ 08 апреля 2010

Прошло довольно много времени с тех пор, как я запрограммировал на C ++, но возможно ли вам перегрузить оператор для BaseClass, чтобы предотвратить назначение?

Может быть, что-то вроде:

BaseClass& BaseClass::operator=(const BaseClass& myVar)
{ 
   if(this != &myVar)
      return *this
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...