Как вызвать виртуальную функцию производного класса из базового класса в C ++ - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть:

class A
{
public:
    virtual some_type foo();
protected:
    virtual some_type bar();
}

class B : public A
{
protected:
    some_type bar() override;
}

// std::shared_ptr<B> b_ptr;
b_ptr->foo();

Где A::foo звонит bar. По какой-то причине, которую я не могу понять, A::bar называют insted из B::bar. Есть ли способ убедиться, что вместо B::bar вызывается?

РЕДАКТИРОВАТЬ:

some_type A::foo() {
    this->bar();
}

РЕДАКТИРОВАТЬ 2: Класс был создан как A, а затем приведен к B, следовательно, общий указатель на B был недействительным.

1 Ответ

2 голосов
/ 23 апреля 2020

Это зависит.

Если foo() вызывает bar() таким образом:

some_type foo(){ A::bar(); }

Это привязка времени компиляции, и поэтому компилятор связывает этот вызов с A::bar() даже если тип Dynami c равен B.

Вместо этого, если foo() вызывает bar() следующим образом:

some_type foo(){ this->bar(); /*or just bar(), same thing*/}

Тогда, поскольку bar() является виртуальным привязка будет разрешена во время выполнения, и поэтому она вызовет функцию bar() для типа Dynami c, таким образом B::bar().

Итак, этот код:

class A
{
public:
    virtual void foo(){this->bar();};
protected:
    virtual void bar(){cout<<"A";};
};

class B : public A
{
protected:
    void bar() override{cout<<"B";};
};

int main() {
    std::shared_ptr<B> b_ptr(new B);
    b_ptr->foo(); // B
}

Будет печатать B, но этот код:

class A
{
public:
    virtual void foo(){A::bar();};
protected:
    virtual void bar(){cout<<"A";};
};

class B : public A
{
protected:
    void bar() override{cout<<"B";};
};

int main() {
    std::shared_ptr<B> b_ptr(new B);
    b_ptr->foo(); // A
}

будет печатать A

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