функцията за проверка на c++ е претоварена или не по време на изпълнение

Имам абстрактен интерфейс 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.

ДОБАВЯНЕ: И така, много хора посочиха, че дизайнът е лош, срещу концепцията за абстракция и виртуални функции. Основната причина, поради която правя това, е да прескоча празните извиквания на функции, за да подобря скоростта. Тъй като някои от Foo() са празни, бих искал да го премахна от вектор от pis, когато Foo() е празен.


person xosp7tom    schedule 04.01.2012    source източник
comment
Защо? Ако извикате функцията, ще видите дали тя завършва в I::foo. Тогава ще разберете!   -  person Bo Persson    schedule 04.01.2012
comment
От любопитство, защо искате да направите това? Усещам лош дизайн.   -  person Benjamin Lindley    schedule 04.01.2012
comment
Доколкото знам, не можете да съхраните резултата от динамично изпращане. Имах въпрос за това в някакъв момент. Все пак можете да го направите в Objective-C++.   -  person Kerrek SB    schedule 04.01.2012
comment
Не е ли целият смисъл на абстракцията не да знаете това? защо ти трябва   -  person littleadv    schedule 04.01.2012
comment
Не, не можеш. И не трябва.   -  person Cat Plus Plus    schedule 04.01.2012
comment
Това би било полезно и за мен.   -  person Seth Carnegie    schedule 04.01.2012


Отговори (2)


Не можете да разберете от &pi->Foo, тъй като, както ще ви каже съобщението за грешка на GCC,

ISO C++ забранява вземането на адреса на обвързана членска функция за формиране на указател към членска функция.

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

person Fred Foo    schedule 04.01.2012
comment
Дори и да използвате typeid, не можете да разберете дали дадена функция е отменена - person Seth Carnegie; 04.01.2012
comment
@SethCarnegie: не, но можете да изброите типовете, които са заменили дадена функция. - person Fred Foo; 04.01.2012

Можете да dynamic_cast указателя си към всеки от дъщерните типове, които заместват Foo и ако е един от тези типове, той ще извика дъщерния тип. Не можете да вземете адреса на функция член, използвайки синтаксиса ->, който искате да използвате.

Но всичко това каза, че наистина бих преосмислил дизайна ви, преди да направя нещо подобно. Смисълът на интерфейсите и виртуалните методи е да се избегне необходимостта да знаете с какъв тип си имате работа!

person Mark B    schedule 04.01.2012