2009-10-27 2 views
2

Это ситуация:C++ ошибка: не может объявить поле, чтобы быть абстрактным типом

class Base { 
    virtual void methodA() = 0; 
    virtual void methodB() = 0; 
}; 

class Base_A : public Base { 
    void methodA(); 
    void methodB(); 
}; 

class Base_B : public Base { 
    void methodA(); 
    void methodB(); 
}; 

class MyClass { 
    private: 
     Base * b; 
}; 

Когда я компилирую это дает сообщение об ошибке:

error: cannot declare field MyClass::b to be of abstract type because the following virtual functions are pure within Base:
Base::methodA()
Base::methodB()

Как решить эту проблему?

UPDATE Он компилируется. Я не знаю, что я изменил

+7

Действительно ли это 'Base * b;', а не 'Base b;'? – sharptooth

+1

Правильно ли отредактирован ваш код? Он действительно компилирует OK и является правильным. Возможно, ваш исходный код имел «Base b» вместо «Base * b». «Base b» даст ошибку, которую вы получите. – Skizz

+3

Также .. не забудьте сделать базовый деструктор виртуальным. – Naveen

ответ

2

Ваши фрагменты кода хорошо компилируются на моем компьютере. Вы уверены, что используете Base* b, т.е. тип указателя, а не Base b?

+0

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

+1

@Jurily: Да, база абстрактная. Если вы попытаетесь создать поле этого типа ('Base b'), компилятор будет жаловаться, что один * не может объявить поле MyClass :: b абстрактным типом *. Указатели на абстрактные типы не абстрактны, и пример OP ('Base * p') должен работать. –

4

Вы код кажется правильным и идеальным.

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

Таким образом, вы можете написать Base b вместо Base * b, пожалуйста, проверьте его.

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