Вызов метода из типа указателя, который создается из объекта, который не содержит этот метод - PullRequest
0 голосов
/ 24 октября 2019

В коде ниже:

1- В (2), почему BarIt() вызывается несмотря на то, что Foo (созданный в (1)) не содержит BarIt ()? Должна ли быть ошибка времени выполнения (т.е. неопределенное поведение), не так ли?

2- При (3) также BarIt() вызывается несмотря на то, что Foo (созданный в (1)) не содержит BarIt ().

3 - Если я проверил bar для NULL, BarIt() не будет вызван? Это значит, что bar равно NULL. Как bar равняется NULL и BarIt(), как вам звонят? это должно быть NULL ошибка исключения.

Примечание: я использую g ++ для кодовых блоков.


class Base
{
public:
    virtual void DoIt() = 0;    // pure virtual
    virtual ~Base() {};
};

class Foo : public Base
{
public:
    virtual void DoIt()
    {
        cout << "Foo\n";
    };
    void FooIt()
    {
        cout << "Fooing It...\n";
    }
};

class Bar : public Base
{
public :
    virtual void DoIt()
    {
        cout << "Bar\n";
    }
    void BarIt()
    {
        cout << "baring It...\n";
    }
};

int main()
{    
    Base* base = new Foo; (1)

    base->DoIt();

    //Bar* bar = (Bar*)base;  
    //bar->BarIt();  (2)

    Bar* bar = dynamic_cast<Bar*>(base);

    //if(bar)
    bar->BarIt();  (3)

    return 0;
}
...