2011-01-12 2 views

ответ

3

Я не уверен, что правильно понял ваш вопрос, но вы должны реализовать все методы, объявленные, но не реализованные в абстрактном базовом классе, иначе, естественно, ваш класс также считается абстрактным.

+0

Правильно, но ваша терминология немного выключена: вы должны не чисто реализовать все чистые методы в базе. Можно реализовать чистый метод; это чаще всего наблюдается при реализации чистых dtors. –

2

Если ваш класс объявляет любые «чисто виртуальные» методы (т. Е. С «= 0») или наследует любые чистые виртуальные методы, не переопределяя их, ваш класс будет абстрактным.

2
class A 
{ 
public: 
    virtual void fun() = 0; //"pure" virtual function 
    virtual void gun() = 0; //"pure" virtual function 

    virtual void sun() //virtual function - "not pure" 
    { 
     /***** implementation code *****/ 
    } 
}; 

Здесь A является абстрактным классом, поскольку он имеет две чистые виртуальные функции.

class B : public A 
{ 
public: 
    virtual void fun() 
    { 
     /******* implementation code ********/ 
    } 
}; 

Вопрос: Что такое B? Это не абстрактный? В конце концов, он определил/внедрил одну чистую виртуальную функцию под названием fun()?

Ответ: No. B тоже является абстрактным классом, так как он не определяет/реализации gun(), который тоже является чисто виртуальная функция в базовом классе A. Определение только одного чистой виртуальной функции, называемой fun(), не делает ее не абстрактной. Он должен определить ВСЕ виртуальные функции. ALL означает ALL, столько, сколько существует виртуальных функций.

Итак, две важные заметки: 1) чистые виртуальные функции, 2) определить их все. Только тогда класс может стать конкретным/не-абстрактным!

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