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

Reply via email to