2013-11-16 3 views
0

1) Я хочу создать абстрактный класс, который два производных класса могут наследовать все абстрактные методы и НЕ должны переопределять любое поведение. Это означает, что у меня нет чистой виртуальной функции, чтобы заставить подклассы предоставлять. Означает ли это, что я не могу создать абстрактный класс (я знаю, на Java я могу)?C++ Абстрактные классы и создание производных классов

2) Я немного не уверен, как я создаю свои производные классы, учитывая, что у меня есть конструктор для абстрактного класса, но какова цель этого конструктора? Должен ли я явным образом называть его откуда угодно?

ответ

2

Да, вы все равно можете сделать его абстрактным. Идиоматическая вещь - сделать деструктор чистым виртуальным. (Обратите внимание, что, несмотря на чисто виртуальную работу, вам все равно необходимо предоставить определение деструктора.)

E.g.

struct Base { 
    virtual ~Base() = 0; 

    virtual void fn1(); 
    virtual void fn2(); 
    // ... 
}; 

Если вы хотите вызвать нестандартный конструктор из вашего производного класса конструктора вам необходимо использовать список инициализации членов. Например.

Derived::Derived() : Base(0, 1.5, "hello") { 
} 

Если вы только вызов конструктора по умолчанию базового класса, как правило, можно оставить это и базовый конструктор по умолчанию будет вызываться автоматически, когда экземпляр любого производного класса строится.

1

1) В C++ вам не нужно определять класс как абстрактный или что-то еще. Вы можете расширить любой класс, если вы не хотите переопределять поведение функции, вам даже не нужно отмечать методы как виртуальные. Если они protected или public, они будут доступны в производных классах.

2) Конструктор базового класса будет вызываться без вашей команды перед конструктором производного класса.

1

1) Объявить свой деструктор как чисто виртуальный:

virtual ~BaseClass() = 0; 

2) Вы можете вызвать его из списков инициализации производных классов конструкторов, но если это конструктор по умолчанию, он будет вызван автоматически. Помните - для инициализации производного объекта вы должны сначала инициализировать свою часть базового класса (которая выполняется автоматически для вас, вызывая конструктор базового класса, в случае конструктора по умолчанию).

Смежные вопросы