Я пытаюсь понять точку здесь, на C++. Если класс A имеет не виртуальный метод, а класс B, который расширяет A, переопределяет этот метод, могу ли я создать экземпляр B и каким-то образом использовать метод, определенный в B? Есть ли смысл переопределить не виртуальный метод?Могу ли я использовать метод, переопределяющий не виртуальный метод?
ответ
Есть ли смысл переопределить не виртуальный метод?
Вы на самом деле не отвергая, но это поведение, то есть
B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method
Таким образом, указатель/ссылочный тип определяет метод, называемый.
Могу ли я создать экземпляр B и каким-то образом использовать метод, определенный в B?
Да. Тип указателя/ссылки должен иметь тип B. (см. Предыдущий пример).
Если вы не объявляете method
быть virtual
, вы не можете переопределения, но вы можете скрыть это.
Отличный ответ, спасибо – Eyal
Одна из «полученных» - это ситуация, когда 'A' в свою очередь происходит от некоторого базового класса (или реализует интерфейс), который объявляет' virtual method() ', и в этом случае метод' a->() 'на самом деле вызовет' B.method() '... – BadCash
@Chip Вы пропустили, чтобы подчеркнуть разницу. Этот ответ завершен только с комментарием BadCashs. – ManuelSchneid3r
Если B
наследует от A
и переопределяет метод, определенный в A
, то новые экземпляры B
позвонит версии B
«s. Однако, если метод не является виртуальным, то полиморфное поведение не существует, поэтому, если экземпляр B
упоминается как A
, тогда метод будет A
. Например:
struct A {
void foo() { std::cout << "A::foo" << std::endl; }
};
struct B : public A {
void foo() { std::cout << "B::foo" << std::endl; }
};
B b;
b.foo();
A *a = &b;
a->foo();
Выход кода выше будет:
B::foo
A::foo
Однако, если метод foo
был виртуальным, то B::foo
была бы напечатана дважды.
Хорошо написано! :) – niknak
Если функция не virtual
то тип переменной определяет, какая реализация отправляется слишком:
#include <iostream>
using namespace std;
struct A {
void f() { cout << "A" << endl; }
};
struct B : public A {
void f() { cout << "B" << endl; }
};
int main(int args, char** argv) {
B b;
A& a = b;
b.f();
a.f();
return 0;
}
- Нет, не существует никакого механизма, чтобы переопределить невиртуальные метод в классе А.
- Да, вы можете использовать не виртуальный метод из класса А перегруженный в B с помощью оператора разрешения области видимости A :: имяМетода
- 1. Переопределяющий метод C++
- 2. NSubstitute - притворяется виртуальный метод, который вызывает еще один виртуальный метод
- 3. Могу ли я перегрузить чистый виртуальный метод в базовом классе?
- 4. Виртуальный метод не называется
- 5. Могу ли я использовать декомпилированный метод?
- 6. Виртуальный метод не называется
- 7. Виртуальный метод не переопределяется?
- 8. Является ли виртуальный метод значительным?
- 9. Можно ли переопределить не виртуальный метод?
- 10. Как я могу использовать метод?
- 11. Почему я не могу использовать общедоступный метод?
- 12. Почему я не могу использовать анонимный метод?
- 13. Почему я не могу использовать метод callUDF?
- 14. Почему Object.ToString виртуальный метод?
- 15. C++ виртуальный метод не называется
- 16. C# виртуальный статический метод
- 17. Аннотация или виртуальный метод?
- 18. принизить неиспользованный виртуальный метод
- 19. виртуальный метод в исключениях
- 20. Виртуальный метод, вызывающий другой виртуальный метод в шаблонизированном классе
- 21. Виртуальный метод специализированного класса
- 22. переопределить виртуальный метод C++
- 23. C++ виртуальный метод путаницы
- 24. невыполненный чисто виртуальный метод
- 25. Виртуальный метод & этот указатель
- 26. Как пробить виртуальный метод?
- 27. Попытка вызвать виртуальный метод
- 28. Асесс прародитель виртуальный метод
- 29. Невыполненный чистый виртуальный метод?
- 30. Полиморфизм и виртуальный метод
То, что вы называете, называется * скрывается *, а не переопределяет. Взгляните сюда, например: http://stackoverflow.com/questions/2161462/c-inheritance-and-function-overriding – jrok