Это может показаться простым вопросом, но я нигде не могу найти ответа.
Предположим, у меня есть следующее:
class Abstract {
public:
virtual void foo() = 0;
virtual void bar();
}
class Derived : Abstract {
public:
virtual void foo();
}
Это нормально, что класс Derived не реализует функцию bar ()? Что делать, если не ВСЕМ моим производным классам нужна функция bar (), но некоторым она нужна. Все ли виртуальные функции абстрактного базового класса должны быть реализованы в производных классах или только те, которые являются чисто виртуальными? Благодарность
источник
Derived::bar
есть тело функцииAbstract::bar
. Таким образом, кажется, что единица перевода, в которой она определена (она вообще где-то определена?), Не связана с единицей перевода, в которой она вызывается.They only need to implement the pure ones.
Это вводит в заблуждение. Производные классы также не обязательно должны реализовывать чистые виртуальные функции.В производных классах должны быть реализованы только чистые виртуальные методы, но вам по-прежнему необходимо определение (а не просто объявление) других виртуальных методов. Если вы его не предоставите, компоновщик может пожаловаться.
Итак, просто добавив
{}
после необязательного виртуального метода, вы получите пустую реализацию по умолчанию:class Abstract { public: virtual void foo() = 0; // pure virtual must be overridden virtual void bar() {} // virtual with empty default implementation }; class Derived : Abstract { public: virtual void foo(); };
Однако более сложная реализация по умолчанию будет помещена в отдельный исходный файл.
источник
Стандарт ISO C ++ указывает, что должны быть определены все виртуальные методы класса, которые не являются чисто виртуальными.
Проще говоря, правило таково:
если ваш производный класс переопределяет виртуальный метод базового класса, он также должен предоставлять определение. Если нет, то базовый класс должен предоставлять определение этого метода.
В соответствии с приведенным выше правилом в вашем примере кода
virtual void bar();
требуется определение в базовом классе.Справка:
C ++ 03 Стандарт: 10.3 Виртуальные функции [class.virtual]
Так что либо вам следует сделать функцию чисто виртуальной, либо дать ей определение.
В НКУ чаво doccuments это так:
источник
Да, это нормально ... вам нужно только реализовать любые чистые виртуальные функции, чтобы создать экземпляр класса, производного от абстрактного базового класса.
источник
Да, это правильно, что производный класс должен ПЕРЕПРЕРЫВАТЬ функцию, которая является Pure Virtual в родительском классе. Родительский класс, имеющий чистую виртуальную функцию, называется абстрактным классом только потому, что его дочерний класс должен предоставлять собственное тело чистой виртуальной функции.
Для обычных виртуальных функций: - Нет необходимости переопределять их дальше, поскольку некоторые дочерние классы могут иметь эту функцию, а некоторые могут не иметь.
Основным назначением механизма виртуальной функции является полиморфизм времени выполнения, независимо от того, является ли основная цель чистой виртуальной функции (абстрактного класса) обязательной, чтобы функция имела то же имя, что и собственное тело.
источник