вызов виртуальной функции от базового класса

Используя FQL, вы можете сделать это:

http://graph.facebook.com/fql?q=SELECT url, total_count FROM link_stat WHERE url='PASTE_YOUR_URL_HERE'
50
задан Gal Goldman 30 December 2008 в 10:40
поделиться

6 ответов

G производного класса назовут. Если Вы хотите вызвать функцию в основе, звоните

Base::g();

вместо этого. Если Вы хотите назвать полученный, но все еще хотеть иметь базовую версию названы, расположение, что полученная версия g называет базовую версию в своем первом операторе:

virtual void g() {
    Base::g();
    // some work related to derived
}

то, что функция от основы может назвать виртуальный метод и управление, передается в производный класс, используется в шаблонном шаблоне разработки метода. Для C++ это более известно как Non-Virtual-Interface. Это широко используется также в библиотеке стандарта C++ (потоковые буферы C++, например, имеют функции pub..., которые вызывают виртуальные функции, которые делают реальную работу. Например pubseekoff вызовы защищенный seekoff). Я записал пример этого в этом ответе: , Как Вы проверяете object’s внутреннее состояние?

54
ответ дан Community 7 November 2019 в 21:03
поделиться

pBase - это указатель на базу. pBase = new Derived возвращает указатель на Derived - Derived is-a Base.

Итак, pBase = new Derived является допустимым.

pBase ссылается на базу, поэтому она будет смотреть на производное, как если бы это была база.

pBase-> f () вызовет Derive :: f ();

Затем мы видим в коде, что:

Derive :: f () -> Base :: f () -> g () - но который g ??

Ну, он вызывает Derive :: g (), потому что это g, на который "указывает" pBase.

Ответ: Derive :: g ()

5
ответ дан 7 November 2019 в 11:03
поделиться

Хорошо... Я не уверен, что это должно скомпилировать. Следующее,

Base *pBase = new Derived;

недопустимо, если Вы не имеете:

Class Derived : public Base

он, хотят Вас предназначенный? Если бы это, хотят Вас предназначенный,

pBase->f();

Тогда, стек вызовов пошел бы как это:

Derived::f()
    Base::f()
        Derived::g()
2
ответ дан user48956 7 November 2019 в 21:03
поделиться

На самом деле выполнение Вашего кода показывает что Полученный:: g () назван.

1
ответ дан KJAWolf 7 November 2019 в 21:03
поделиться

Поскольку Вы определили g (), чтобы быть виртуальными, наиболее полученный g () будет искаться в vtable из класса и звонил независимо от типа, Ваш код в настоящее время получает доступ к нему.

Посмотрите FAQ C++ на виртуальных функциях .

1
ответ дан Thorsten79 7 November 2019 в 21:03
поделиться

Я думаю Вы пытающийся изобрести Шаблонный Шаблон Метода

0
ответ дан Evgeny Lazin 7 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: