Почему деструктор Abstract class
должен быть виртуальным и иметь определение?
Вызов delete
для полиморфного указателя базового класса, указывающего на объект производного класса& Базовый класс, не имеющий виртуального деструктора, вызывает неопределенное поведение .
Итак, вам нужно объявить деструктор полиморфного базового класса как virtual
.Как только вы объявите свой деструктор явно виртуальным, вам нужно будет дать определение для него.Это потому, что компилятор по умолчанию генерирует (определяет) деструктор для каждого класса, но если вы явно объявите деструктор, то компилятор не сделает этого и оставит вам возможность предоставить определение для вашего собственного деструктора.Это имеет смысл, потому что компилятор видит явное объявление как указание на то, что вы хотите выполнить некоторые нетривиальные операции (даже если вам это не нужно) в деструкторе, и это дает вам возможность сделать это, заставив вас датьопределение.
Миф 1:
В C ++ есть нечто, называемое Interface
.
NO
C ++ как язык не обеспечивает Interface
То, что вы называете Interface
, называется Abstract class
в C ++.Abstract Classes
используются для имитации поведения Interface
в C ++.
Что такое абстрактный класс?
По определению абстрактный класс должен иметь хотя бы одна чисто виртуальная функция.
Миф 2:
Все функции внутри класса Abstract должны быть чисто виртуальными.
NO
Abstract classes
не требует, чтобы все функции внутри них были чисто виртуальными.Объект реферата не может быть создан, если он имеет хотя бы одну чисто виртуальную функцию.Однако, как вы правильно упомянули, вы можете создавать на него указатели.
Миф 3:
Чистые виртуальные функции не могут иметь определения.
NO
Для виртуальных функций Pure вполне допустимо иметь определение.
Почему быМне когда-нибудь нужен Pure virtual function
с определением?
Код говорит громче, чем слова, поэтому вот простой пример:
Предупреждение: некомпилированный код только для демонстрации
class IMyInterface
{
int i;
int j;
public:
virtual void SetMembers(int ii, int jj)=0;
};
/*The pure virtual function cannot be inline in the class definition*/
/*So this has to be here*/
void IMyInterface::SetMembers(int ii, int jj)
{
i = ii;
j = jj;
}
class Myclass: public IMyInterface
{
int k;
int l;
public:
virtual void SetMembers(int ll, int m, int a, int b)
{
k = ll;
l = m;
IMyInterface::SetMembers(a,b);
}
};
int main()
{
MyClass obj;
obj.SetMembers(10,20,30,40);
return 0;
}