Учитывая следующий сценарий, у меня есть базовый класс MyBaseClass
с чистой виртуальной функцией void foo() = 0;
. Два класса MyClassA
и MyClassB
получены из этого класса MyBaseClass
. Оба реализуют функцию foo()
. Теперь в проекте, над которым я работаю, я наткнулся на объект, созданный из класса MyBaseClass
, на который вызывается функция foo()
. Интересно, что это реализация от MyClassB
, которая используется. Где определено, что именно эта реализация, а не один из MyClassA
Реализация чистой виртуальной функции в C++
ответ
я наткнулся на объект, созданный из класса MyBaseClass
Нет, ты не сделал. Объекты типа MyBaseClass
не могут существовать. Класс абстрактен и не может быть создан.
Возможно, вы указали указатель на MyBaseClass
, который может указывать на любые объекты классов, наследующие базовый класс.
Есть ли способ вызова реализации MyClassA, хотя pA указывает на объект класса MyClassB? Может быть, с актерским составом?
Вы можете позвонить
pA->MyBaseClass::foo();
, но это будет работать только тогда, когда функция реализована. (да, вы можете обеспечить реализацию для чистого метода)
Спасибо, это действительно указатель, а не объект базового класса! Есть ли способ вызвать реализацию 'MyClassA', хотя' pA' указывает на объект класса 'MyClassB'? Может быть, с актерским составом? – tzippy
@tzippy смотреть редактирование. –
Объект был типа MyClassB
не MyBaseClass
. MyBaseClass
является абстрактным и не может быть создан. Однако у вас, вероятно, был указатель MyBaseClass*
, который указывал на экземпляр MyClassB
.
Возможно, вам стоит прочитать о наследовании и полиморфизме на C++, если вам нужна дополнительная информация.
MyBaseClass base; // Compiler error, cannot instantiate abstract class
MyClassA a;
MyClassB b;
MyBaseClass* pA = &a;
MyBaseClass* pB = &b;
pA->foo(); // Uses implementation of foo in MyClassA
pB->foo(); // Uses implementation of foo in MyClassB
Вы были правы. Это был указатель 'MyBaseClass', я благодарю вас за указание на это. – tzippy
Есть ли способ вызова реализации MyClassA, хотя 'pA' указывает на объект класса' MyClassB'? Может быть, с актерским составом? – tzippy
Нет, это не безопасно.'MyClassA' и' MyClassB' - разные типы. Если вы пытаетесь использовать общие методы между двумя классами, вы можете реализовать его в базовом классе. – dunc123
Важно заметить разницу между этими отрывками:
struct X
{
virtual void foo() = 0;
};
X x; // not valid! X has purely virtual methods
и
struct X; // as above
struct Y : X
{
void foo() {}
void bar() {}
};
X * x = new Y; // valid!
Второй случай, наиболее вероятно, что вы уже видели. В этом шаблоне вы можете позвонить x->foo();
, и он позвонит Y::foo()
. Обратите внимание, что вы не можете, однако, позвонить x->bar()
, потому что X::bar()
не существует.
- 1. Как наследовать Реализация чистой виртуальной функции C++
- 2. Реализация чистой виртуальной функции через наследование
- 3. C++ - Параметры чистой виртуальной функции
- 4. Выполнение чистой виртуальной функции
- 5. Перегрузка чистой виртуальной функции
- 6. Реализация виртуальной функции C++?
- 7. Реализация виртуальной функции C++
- 8. undefined reference в чистой виртуальной функции C++
- 9. Наследование реализации чистой виртуальной функции
- 10. C++: необъяснимая ошибка «чистой виртуальной функции»
- 11. Цель частной чистой виртуальной функции?
- 12. Странное поведение чистой виртуальной функции
- 13. Почему реализация абстрактного класса не видит перегруженной чистой виртуальной функции?
- 14. Что такое эквивалент чистой виртуальной функции C++ в Objective-C?
- 15. Переопределение чистой виртуальной функции из шаблонных классов
- 16. C++: переопределение виртуальной чистой функции, полученной из класса шаблона
- 17. Вызов виртуальной функции и чистой виртуальной функции от конструктора
- 18. Класс с реализацией чистой виртуальной функции
- 19. Разница между виртуальной и чистой виртуальной функцией?
- 20. Почему это не вызов чистой виртуальной функции?
- 21. Какова необходимость реализации чистой виртуальной функции
- 22. константный спецификатор исчезает из чистой виртуальной функции
- 23. Почему требуется запись чистой виртуальной функции в виртуальной таблице
- 24. Что может вызвать вызов чистой виртуальной функции в C++?
- 25. Добавление тела к чистой виртуальной/абстрактной функции в C++?
- 26. SFML C++ рисование в RenderWindow чистой виртуальной функции сбой выполнения
- 27. использование чистой виртуальной функции, определенной вне класса в C++?
- 28. Предоставление определения для чистой виртуальной функции
- 29. Ошибка Python и чистой виртуальной функции
- 30. Ошибка «чистой виртуальной функции» при отлаживании ТОЛЬКО
Если 'MyBaseClass' имеет чистую виртуальную функцию, как ее можно создать? – HAL