Выяснение того, что делает класс C ++ абстрактным в VS2008 - PullRequest
0 голосов
/ 26 апреля 2010

Я использую VS2008 для создания простой старой программы C ++ (не C ++ / CLI). У меня есть абстрактный базовый класс и неабстрактный производный класс, и построение этого:

Base* obj;
obj = new Derived();

завершается с ошибкой «Derived: невозможно создать экземпляр абстрактного класса». (Однако стоит отметить, что если я наведу курсор мыши на Base, VS выдаст всплывающую подсказку с надписью «реферат класса», но при наведении курсора на Derived будет только «класс Derived» (no абстрактный ")).

Определения этих классов довольно велики, и я бы хотел избежать ручной проверки, был ли каждый метод переопределен. Может ли VS сделать это для меня как-нибудь? Какие-нибудь общие советы по определению точных частей определения класса, которые делают его абстрактным?

Ответы [ 3 ]

7 голосов
/ 26 апреля 2010

Компилятор должен сообщить вам об ошибке. Следующее:

struct base
{
    virtual void foo(void) = 0;
    virtual void bar(void) = 0;
};

struct derived : base
{
    virtual void foo(void){}
};

int main(void)
{
    derived d;
}

Производит:

ошибка C2259: «производная»: невозможно создать экземпляр абстрактного класса
из-за следующих членов:
'void base :: bar (void)': является абстрактным
см. объявление 'base :: bar'

То же самое относится и к динамическому распределению.

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

Что сказал Ган. Плюс используйте лучший компилятор :-) В g ++ ошибка:

ab.cpp: In function 'int main()':
ab.cpp:14: error: cannot declare variable 'd' to be of abstract type 'derived'
ab.cpp:8: note:   because the following virtual functions are pure within 'derived':
ab.cpp:4: note:         virtual void base::bar()
1 голос
/ 26 апреля 2010

Нет, я не верю, что VS делает что-то подобное из коробки. См. Ответ GMan.

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

...