Уважаемые коллеги! В одном соревновании столкнулся с таким кодом:
class A {
public:
virtual void f(){cout<<1;}
};
class B: public A {
public:
void f(){cout<<2;}
};
class C: public B {
public:
void f(){cout<<3;}
};
int main() {
B *p = new C;
p->f();
}
OUTPUT: 3
Вопрос: Как вообще работает это? Почему выводит тройку, а не что-то ещё? И как называется (зачем используется в промышленном программировании) такая конструкция как:
B *p = new C;
p->f();
В ответе выводит 3, потому что функция f - это виртуальная функция, переопределенная в наследуемом классе. При этом переменная p - это указатель на экземпляр класса B, который инициализируется экземпляром класса C. Класс C наследуется от B, поэтому в таблице виртуальных функций f указывает на функцию именно класса C, а не B. В итоге через указатель p вызывается функция класса C. В промышленном программировании применений много. Например, когда требуется изменять поведение во время выполнения. Создается базовый класс, который реализует некий интерфейс (функция f). Создаются классы наследники, каждый из которых реализует интерфейсную функцию по своему. Переменная - указатель на базовый класс хранит экземпляр с требуемым поведением и может быть изменена во время выполнения для изменения поведения. Вот пример:
#include <iostream>
using namespace std;
class Animal{
public:
virtual void say() = 0;
};
class Cat : public Animal{
public:
void say(){
cout << "Мяу" << endl;
}
};
class Dog : public Animal{
public:
void say(){
cout << "Гав" << endl;
}
};
int main() {
Cat cat;
Dog dog;
Animal *a;
a = &cat;
a->say();
a = &dog;
a->say();
return 0;
}
в результате животное сначала скажет Мяу, а потом Гав
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть контейнер, типом которого есть мой клас A, контейнер, к примеру, set< class A>Я создаю итератор set::iterator iter = set< class A >
Есть товары на странице,у каждого товара есть кнопка "В корзину"Вот код этих кнопок:
Можно ли при компиляции в SASS убрать вложенность? Или писать код без вложенности? На данный момент это выглядит вот так: