Почему производный класс должен объявлять свои методы виртуальными для динамической привязки для работы, даже если методы базового класса объявлены виртуальными?Динамическое связывание в C++
ответ
Этого не нужно. Если метод объявлен виртуальным в базовом классе, переопределение его в производном классе также делает виртуальную функцию переопределения, даже если ключевое слово virtual
не используется.
Не правда ли? Следующий код генерирует ожидаемый выход B :: f1() (скомпилирован с использованием VS2008):
class A
{
public:
virtual ~A(){}
virtual void f1()
{
std::cout<<"A::f1()\n";
}
virtual void f2()
{
std::cout<<"A::f2()\n";
}
};
class B : public A
{
public:
void f1()
{
std::cout<<"B::f1()\n";
}
void f2()
{
std::cout<<"B::f2()\n";
}
};
int main()
{
B b;
A* p = &b;
p->f1();
return 0;
}
Спасибо за ваш ответ, много помогли. – user224579
Это не так.
class Base
{
virtual void foo() {}
};
class Derived : public Base
{
void foo() {}
}
в этом коде foo()
еще виртуальный в Derived
классе, даже если она не объявлена как таковой.
Процитируем Стандарт C++ (10.3.2):
Если виртуальная функция-член
vf
объявляется в классеBase
и в классеDerived
, полученных непосредственно или косвенно изBase
, функцию-членvf
с тем же именем и тем же списком параметров, что иBase::vf
, тоDerived::vf
также является виртуальным (независимо от того, объявлен он или нет), и он переопределяетBase::vf
.
Вы можете подытожить это следующим образом: «один раз виртуальный, всегда виртуальный». Тем не менее, вы можете добавить модификатор virtual
к переопределяющим функциям-членам, чтобы дать пользователю понять, что класс является полиморфным.
Не нужно этого. Но я предпочитаю использовать виртуальные функции производного класса, так как это сделает динамическое связывание, связанное с этими функциями, более понятным при чтении кода.
- 1. Динамическое связывание в C#
- 2. Динамическое связывание в C++ @
- 3. C++ динамическое связывание
- 4. C++ динамическое связывание с перегрузкой
- 5. Динамическое связывание?
- 6. Динамическое связывание
- 7. Динамическое связывание виртуальных функций в C++
- 8. C++ Динамическое связывание в аргументе метода
- 9. Полиморфизм в C++ идея vtable (динамическое связывание)
- 10. В C++ этот метод вызывает статическое связывание или динамическое связывание?
- 11. Динамическое связывание в XAMGrid
- 12. Динамическое связывание в SQL
- 13. Динамическое связывание в java?
- 14. Динамическое связывание в Java
- 15. Динамическое связывание в zOS
- 16. динамическое связывание в CoffeeKup
- 17. Динамическое связывание в PHP
- 18. Статическое связывание и динамическое связывание
- 19. Динамическое связывание в Visual Studio
- 20. Динамическое связывание с конструктором
- 21. Динамическое связывание таблиц в VBA
- 22. динамическое связывание события в usercontrol
- 23. Динамическое связывание с Cmake
- 24. Динамическое связывание AIX
- 25. DataGridView comboboxcolumn динамическое связывание
- 26. Динамическое связывание частных методов: Java против C++
- 27. C# Связывание dll статическое и динамическое
- 28. Все еще запутано динамическое связывание Objective-C
- 29. Как C++ реализует динамическое связывание внутри?
- 30. DD4T и динамическое связывание
Спасибо, я этого не знал. – user224579