Вот формат кода:
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
Я знаю, что не могу назвать виртуального деструктора, но в понятиях есть что-то ужасное, чего я не знаю. Может кто-нибудь объяснить мне?
Вы не можете создать экземпляр C
потому что вы явно сказали, что деструктор не определен.
Вы могли бы просто сделать:
class C
{
public:
C();
virtual ~C() {}
};
вместо.
Ты можешь уйти C
в точности «как есть», если вы не пытаетесь создать его экземпляр (т.е. вы создаете только D
с, но вы можете передать их как C
s.
«= 0» означает, что вы определяете этот метод как чисто виртуальный. Если класс содержит какой-либо чисто виртуальный метод, то этот класс является чисто виртуальным. Вы не можете создать экземпляр чисто виртуального класса, потому что нет реализации для чисто виртуального метода.
класс С называется 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