Я пытался понять, почему я могу создать чистую виртуальную функцию в файле заголовка, который не был реализован в используемой библиотеке, и что это не будет вызывают связь или даже отказ во время выполнения. Вышеуказанное может быть немного неточным, но вот какой-то код для его резервного копирования.Общая библиотека C++: чистая виртуальная функция не вызывает ошибку связи
Вот определение интерфейса:
class A
{
public:
static A* Create();
virtual ~A() {}
virtual status_t start() = 0;
virtual status_t stop() = 0;
};
У меня есть C++ разделяемую библиотеку, которая содержит реализацию "AImpl" + The A :: Create() функцию (см):
A* A::Create {return new AImpl;}
class AImpl : public A
{
public:
A() {}
virtual ~A() {}
virtual status_t start() {}
virtual status_t stop() {}
};
Я создаю общую библиотеку - проблем нет. Теперь я добавляю еще одну чистую виртуальную функцию в файле заголовка для класса А:
class A
{
public:
static A* Create();
virtual ~A() {}
virtual status_t start() = 0;
virtual status_t stop() = 0;
virtual status_t write() = 0;
};
создать тест приложение, которое использует его:
void main()
{
A* a = A::Create();
a->start();
a->stop();
a->write();
}
Теперь я понимаю, что вышеуказанная компилирует, но я бы подумайте, что это не сработает, поскольку для вызова write() в общей библиотеке нет реализации. Даже во время выполнения не происходит ни крушения, ни чего-либо. Кажется, что вызов записи пропущен. Может кто-нибудь объяснить - это было бы весьма признателен :-)
Благодарности - И извините за длительный вопрос, это было немного трудно для меня, чтобы объяснить точный вопрос в «одном лайнере» ..
Вы действительно уверены, что он перекомпилирован после изменения кода? Можете ли вы заставить перестроить? – leemes
Да, я уверен, что он скомпилирован. Но, как я вижу, компилятор не должен жаловаться. Код в порядке. Но реализация отсутствует в lib, поэтому я бы догадался об ошибке ссылки. –
Вы также перекомпилировали библиотеку? Я думаю, компиляция должна завершиться неудачей в 'A :: create', так как' AImpl' является абстрактным. – leemes