https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86908
Bug ID: 86908 Summary: static_cast<BaseTypeWithVirtualMethod*>(&derivedClassO bject)->virtualMehod() calls base version of virtualMethod() Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: fro0m.spam at gmail dot com Target Milestone: --- #include <cstdio> #include <time.h> #include <stdlib.h> #include <new> class BaseStrategy{ public: virtual void doIt() { printf("base do it\n"); }; }; class AStrategy : public BaseStrategy { public: void doIt() { printf("A do it\n"); }; }; class BStrategy : public BaseStrategy { public: void doIt() { printf("B do it\n"); }; }; int main() { BaseStrategy strategy; BaseStrategy* strategyPtr = &strategy; strategyPtr->doIt(); new(&strategy) AStrategy; static_cast<BaseStrategy*>(&strategy)->doIt(); strategyPtr->doIt(); } Output in gcc 4.9 and gcc 9.0 is base do it base do it A do it the right output must be (according to standard and behavior of MSVC 2015 and clang 6) is base do it A do it A do it