Почему этот код выведет тройку?

201
04 октября 2017, 09:47

Уважаемые коллеги! В одном соревновании столкнулся с таким кодом:

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();
Answer 1

В ответе выводит 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;
}

в результате животное сначала скажет Мяу, а потом Гав

READ ALSO
Как вызвать метод класа через итератор?

Как вызвать метод класа через итератор?

У меня есть контейнер, типом которого есть мой клас A, контейнер, к примеру, set< class A>Я создаю итератор set::iterator iter = set< class A >

197
Как отформатировать время HH:MM

Как отформатировать время HH:MM

Подскажите как получить минуты с 0 если минуты < 10?

265
jquery вставить ссылку

jquery вставить ссылку

Есть товары на странице,у каждого товара есть кнопка "В корзину"Вот код этих кнопок:

255
Вложенность в sass?

Вложенность в sass?

Можно ли при компиляции в SASS убрать вложенность? Или писать код без вложенности? На данный момент это выглядит вот так:

289