Как мне реализовать чистый виртуальный деструктор?

Вот формат кода:

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

class D : public C
{
public:
D();
~D();
};

C::C(){
}

C::~C(){
}

D::D(){
}

D::~D(){
}

int main(){
C *c = new C();
D *d = new D();
return 0;
}

Когда я пытаюсь создать экземпляр c Я получаю следующую ошибку:

1>c:\main.cpp(59): error C2259: 'C' : cannot instantiate abstract class

Я знаю, что не могу назвать виртуального деструктора, но в понятиях есть что-то ужасное, чего я не знаю. Может кто-нибудь объяснить мне?

0

Решение

Вы не можете создать экземпляр C потому что вы явно сказали, что деструктор не определен.

Вы могли бы просто сделать:

class C
{
public:
C();
virtual ~C() {}
};

вместо.

Ты можешь уйти C в точности «как есть», если вы не пытаетесь создать его экземпляр (т.е. вы создаете только Dс, но вы можете передать их как Cs.

5

Другие решения

«= 0» означает, что вы определяете этот метод как чисто виртуальный. Если класс содержит какой-либо чисто виртуальный метод, то этот класс является чисто виртуальным. Вы не можете создать экземпляр чисто виртуального класса, потому что нет реализации для чисто виртуального метода.

4

класс С называется abstract class в C ++, который не может быть инициализирован.

§10.4 / 2 Абстрактные классы Абстрактный класс — это класс, который можно использовать
только как базовый класс какого-то другого класса; нет объектов абстрактного
Класс может быть создан кроме как подобъекты класса, производного от него.
Класс является абстрактным, если он имеет хотя бы одну чисто виртуальную функцию.

менять C *c = new C(); в C *c = new D(); должно сработать.

Или вы можете сделать класс C неабстрактным классом, удалив =0

class C{
public:
C() {}
virtual ~C() {}
};

C* c = new C();  // this is ok
2
По вопросам рекламы [email protected]