Я программист на Java и был признан фактом предоставления исправления для чисто виртуальных функций. В Java я привык думать об абстрактных методах как методах, которые мы предоставим для дефиниций в базовом классе. Но следующий код вполне допустимо:Предоставление определения для чистой виртуальной функции
#include <iostream>
struct A
{
virtual ~A() = 0;
};
A::~A(){ std::cout << "~A()" << std::endl; }
struct B : A
{
~B(){ std::cout << "~B()" << std::endl; }
};
A *a = new B;
int main()
{
delete a;
}
Но если мы пытаемся сделать что-то вроде этого:
#include <iostream>
struct A
{
virtual ~A() = 0;
virtual void foo() = 0;
};
void A::foo(){ }
A::~A(){ std::cout << "~A()" << std::endl; }
struct B : A
{
~B(){ std::cout << "~B()" << std::endl; }
};
A *a = new B;
int main()
{
delete a;
}
Компилятор собирается complaing о не предоставляя определения для чисто виртуальных функций. Почему мы можем определить чисто виртуальный деструктор в области namesapace, но не можем сделать это для обычной функции-члена.
Это скорее исключение, чем правило?
Что? Предоставление определения для чистой виртуальной функции совершенно законно. Компилятор никогда не будет жаловаться на это. Единственная проблема с вашим вторым кодом заключается в том, что вы пытаетесь создать экземпляр абстрактного класса 'B', а не для обеспечения определенной функции. – AnT
@AnT Но я сделал это в области пространства имен. Я дал это определение, что случилось? –
Где? Я не вижу определения для 'B :: foo' где угодно. 'A :: foo' - чистая виртуальная функция. Если вы не отмените его с помощью 'B :: foo', он останется чистым и в' B'. – AnT