Я модифицирую код, что класс grand-parent - это чистый виртуальный, который включает в себя чистую виртуальную версию функции XYZ; то родительский класс then объявляет XYS как виртуальный и имеет для него реализацию. Тогда дочерний класс объявляет XYZ как регулярную функцию с другой реализацией, отличной от версии parent1 9, которая сама по себе меня сбивает с толку). Когда я вызываю функцию XYZ из другого объекта, реализация которого выполняется? родительский или дочерний? СпасибоВ чем разница между чистым виртуальным и виртуальным
ответ
Чистые виртуальные функции не нуждаются в определении (в отличие от виртуальных функций), и они делают свой класс абстрактным. У абстрактных классов не может быть объекта, созданного, кроме случаев, когда они действуют как объект базового класса.
Ваше замешательство, кажется, сосредоточено вокруг присутствия или отсутствия ключевого слова virtual
. Если функция объявлена virtual
в базовом классе, то функция производного класса, независимо от того, вставлена ли она или нет: virtual
, автоматически станет virtual
, если она имеет то же имя, типы параметров и константу.
Так что, если вы звоните XYZ на grandparent*
или parent*
, что на самом деле указывает на child
объекта, то XYZ из child
объекта будет выполняться.
Я понял, что название моего вопроса не имеет отношения к содержанию вопроса. Можете ли вы, пожалуйста, прочитать содержание моего вопроса и помочь, если сможете. Спасибо – user553514
@ user553514: Cheeky. Он ответил на ваш вопрос. –
Чистая виртуальная функция означает, что класс с чистой виртуальной функцией не может быть создан. Когда родительский класс переопределяет его, он просто становится нормальной виртуальной функцией. Как только функция объявлена виртуальной в базовом классе, она всегда является виртуальной, независимо от того, определяет класс наследования как виртуальный.
Редактировать: Это означает, что вызов это просто вызов виртуальной функции, как любой другой, то есть будет вызываться реализация самого производного класса.
+1 за хороший ответ, но получается, что это не вопрос, который фактически задал. Смущаю, я знаю ... –
Чистая виртуальная функция обычно не имеет реализации и создает «абстрактность» класса.
Компилятор не позволит создать экземпляр класса, который является абстрактным. Любой класс, полученный из этого класса, остается абстрактным, если не будут реализованы все чистые виртуальные функции, которые он наследует (и он не добавляет никаких новых). Такой класс называется конкретным.
Обратите внимание, что чистой виртуальной функции может быть предоставлена реализация (хотя она не может быть встроена по причинам синтаксиса). Кроме того, вы можете иметь чистый виртуальный деструктор, а затем ему должна быть предоставлена реализация (даже если она пустая).
Вы указываете чистую виртуальную функцию, добавив = 0 в конце, таким образом:
virtual void foo(); // not pure
virtual void bar() = 0; // pure virtual
Когда я вызываю функцию XYZ из другого объекта, реализация которого запускается на выполнение? родительский или дочерний?
struct A {
virtual void f() = 0;
};
struct B : A {
virtual void f() { cout << "B::f\n"; }
};
struct C : B {
virtual void f() { cout << "C::f\n"; }
};
int main() {
C().f();
return 0;
}
class sample
{
public:
virtual void fun(); //virtual function
virtual void sun()=0; //pure virtual function
};
Чистая виртуальная функция объявлена путем присвоения 0
, как это сделано выше.Обеспечивая определение для чистых виртуальных функций опционально, обеспечивая при этом определение виртуальных функций обязательным, в противном случае он будет не компиляции. Кроме того, вы не можете создать экземпляр класса, который определяет даже одну виртуальную функцию.
Виртуальная функция - это функция, которая может быть переопределена в производном классе.
Чистая виртуальная функция - это та, которая не имеет никакой реализации, и поэтому ДОЛЖЕН быть переопределенным в производном классе.
Вы не можете создать экземпляр класса с чистой виртуальной функцией или класса, который вытекает из него, если вы не переопределите любые чистые виртуальные функции с помощью собственной реализации.
В случае виртуальной функции, если вы звоните хуг на объекте класса ребенка, всегда ребенок версии А (Child::xyz()
) будет выполняться.
Это не относится к не виртуальным переопределенным методам. Тогда, если у вас был указатель Parent* ptr = &child
, ptr>xyz()
фактически выполнил бы Parent::xyz()
. Но в вашем случае это Child::xyz()
. Вот почему вы используете ключевое слово virtual
.
- 1. В чем разница между виртуальным методом с пустым телом и чистым виртуальным методом?
- 2. В чем разница между абстрактным и виртуальным?
- 3. Дизайн с (чистым) виртуальным C++
- 4. В чем разница между базовым адресом изображения, виртуальным адресом и относительным виртуальным адресом?
- 5. В чем разница между физическим драйвером и виртуальным драйвером?
- 6. В чем разница между «не виртуальным интерфейсом» и «абстрактным интерфейсом»?
- 7. В чем разница между размером и виртуальным размером изображений докеров?
- 8. В чем разница между сайтом и виртуальным каталогом
- 9. Разница между виртуальным адресом и физическим адресом?
- 10. Разница между виртуальным адресом и физическим адресом
- 11. Почему можно сделать деструктор чистым виртуальным
- 12. Создание потока boost с чистым виртуальным классом
- 13. Проблема компилятора с чистым виртуальным классом и наследованием в C++
- 14. Разница между виртуальным адресом ядра и логическим адресом ядра?
- 15. Разница между виртуальным, переопределяющим, новым и закрытым переопределением
- 16. разницы между виртуальным и простым наследованием в C++
- 17. Должен ли абстрактный деструктор класса быть чистым виртуальным?
- 18. Должен ли быть инициализирован класс с переопределенным чистым виртуальным деструктором?
- 19. Является ли это абстрактным классом или чистым виртуальным (интерфейсом)?
- 20. C++ Вопросы по виртуальным классам
- 21. Как переключаться между виртуальным и невиртуальным блоком в Simulink?
- 22. Проблемы с виртуальным джойстиком
- 23. В чем разница между чистым и нечистым в haskell?
- 24. Перемещение запущенного приложения между виртуальным рабочим столом
- 25. CloudFiles не может скопировать между виртуальным каталогом
- 26. Проблемы с виртуальным хостом
- 27. Сделать метод визуализации виртуальным?
- 28. Задача управления виртуальным списком
- 29. Документация по виртуальным папкам
- 30. CopyFromScreen с виртуальным экраном
lol @ "grand-parent class" –
XYZ ребенка тоже виртуальный; даже несмотря на то, что ключевое слово «virtual» не было написано, XYZ базы является виртуальным, так что ребенок тоже ... пока список параметров тот же. –