функция проверки c ++ перегружена или не загружена во время выполнения - PullRequest
2 голосов
/ 04 января 2012

У меня есть абстрактный интерфейс I, в котором определено virtual void Foo(), наряду с другими функциями. Есть некоторые подклассы, в которых Foo переопределено, и другие, в которых Foo нет. Теперь, учитывая I* pi, можно ли узнать, переопределено ли Foo? То есть я хочу знать, будет ли pi->Foo() вызывать I::Foo() или X::Foo(), где X - это некоторый тип, в котором Foo переопределен. Я думаю, что это можно сделать, сравнивая указатели функций, между &I::Foo и &pi->Foo, но не знаю точно, как это сделать. Обратите внимание, что я не знаю конкретный тип pi во время выполнения, поэтому я не могу сравнивать указатели функций напрямую по &I::Foo != &X::Foo.

ADD: Итак, многие люди указали, что дизайн плохой, вопреки концепции абстракции и виртуальных функций. Основная причина, по которой я это делаю - это обход пустых вызовов функций для повышения скорости. Поскольку некоторые из Foo() пусты, я бы хотел удалить их из вектора pi s, когда Foo() пуст.

Ответы [ 2 ]

1 голос
/ 04 января 2012

Вы не можете узнать из &pi->Foo, поскольку, как сообщит сообщение об ошибке GCC,

ISO C ++ запрещает брать адрес связанной функции-члена для формирования указателя на функцию-член.

Если вы хотите узнать тип объекта во время выполнения, используйте typeid. В противном случае переосмыслите свой дизайн.

0 голосов
/ 04 января 2012

Вы можете dynamic_cast указывать на каждый дочерний тип, который переопределяет Foo, и если это один из этих типов, он будет вызывать дочерний. Вы не можете получить адрес функции-члена, используя синтаксис ->, который вы хотите использовать.

Но все это говорит о том, что я действительно пересмотрю ваш дизайн, прежде чем делать что-то подобное. Смысл интерфейсов и виртуальных методов состоит в том, чтобы избежать необходимости знать, с каким типом вы имеете дело!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...