Пожалуйста, наберитесь терпения и прочитайте это, чтобы получить ответы на свои вопросы.Наследование - это концепция, в которой объект класса наследует свойства и поведение объекта другого класса.
- Основное введениеРодительский класс также называется базовым классом или суперклассом.Дочерний класс также называется производным классом или подклассом
- На объект производного класса можно ссылаться через базовый класс.
Например
#include <iostream>
using namespace std;
class Base {};
class Derived : public Base {};
int main() {
Base *b = new Derived(); // This is completely valid
return 0;
}
- Переопределение метода в C ++ Давайте рассмотрим простой пример
#include <iostream>
using namespace std;
class Base {
public:
void display() { cout << "Base display called\n"; }
};
class Derived : public Base {
public:
void display() { cout << "Derived display called\n"; }
};
int main() {
Base b;
b.display();
Derived d;
d.display();
Base *bptr = &d;
bptr->display();
return 0;
}
Output:
Base display called
Derived display called
Base display called
Теперь из приведенного выше примера вы могли догадаться, что производный класс переопределяет базовый класс, но это не так.Вывод (3-я строка) показывает, что вызывается функция базового класса.
- Виртуальные функции в C ++
Вы можете сделать любую функцию класса виртуальной, добавив ключевое слово «virtual» в начале функции.Давайте рассмотрим пример виртуальной функции
#include <iostream>
using namespace std;
class Base {
public:
virtual void display() { cout << "Base display called\n"; }
};
class Derived : public Base {
public:
void display() { cout << "Derived display called\n"; }
};
int main() {
Base b;
b.display();
Derived d;
d.display();
Base *bptr = &d;
bptr->display();
return 0;
}
Output:
Base display called
Derived display called
Derived display called
Из приведенного выше примера (строка 3 вывода) ясно, что вы можете добиться переопределения метода с помощью механизма виртуальной функции в C ++.
- Какой эффект делает функцию виртуальной?
Разница между нормальной функцией и виртуальной функцией заключается в том, что нормальная функция разрешается во время компиляции, также известной как статическое связывание, тогда как виртуальная функция разрешается во время выполнения, также известной как динамическая.обязательное или позднее связывание.Какой метод вызывать (метод отображения базового класса или метод отображения производного класса) решается во время выполнения, поскольку функция отображения базового класса становится виртуальной.Вы можете углубиться в механизм виртуальных функций, читая о V-таблицы
Ответы на вопросы1) вызов (г).Я не совсем понимаю, почему, но кажется, что call () может принимать производные классы B в качестве аргумента.=> На объект производного класса может ссылаться базовый класс2) Но D :: g не переопределяет B :: g и по причинам, которые я не могу понять=> Потому что g () не является виртуальным в базовом классе.Только виртуальные функции могут быть переопределены.V-таблица имеет записи только для виртуальных функций, так что они могут быть переопределены во время выполнения.3) call (dd) => Когда вызывается функция f (), функция сначала ищется в базовом классе B, поскольку функция f () является виртуальной, используя указатель v-таблицы, причем функция f () переопределяется в производном классе.Д решен.Но поскольку функция f () не является виртуальной в классе D, переопределенная функция f () в DD не может быть разрешена.Следовательно, D :: f печатается.Но для g () сам базовый класс не имеет виртуального g (), поэтому переопределенные функции в их производных классах не могут быть разрешены.Следовательно, B :: g печатается.4) Вышеупомянутый полиморфизм произошел потому, что на производные классы ссылались их базовые классы (родительские классы), но в последних вызовах такого нет.На все объекты ссылаются их соответствующие классы, и, следовательно, вызываются их соответствующие методы.
Одна базовая логика, чтобы думать об этом, состоит в том, что функция сначала ищется в ссылочном классе, и если она является виртуальной, то функция будет искать в производных классах (если объект, на который ссылаются, является дочерним классом).Если производные классы переопределяют, будет вызван производный метод, иначе будет вызван базовый метод.Вы можете дополнительно расширить концепцию, применяемую к базовому классу, к производному классу, а также проверить, является ли функция виртуальной или нет, а затем, если функция виртуальная и объект является производным (потомок производного, внук базового класса).) и так далее.Надеюсь, это прояснит.