Обнаруживают ли операторы изменения то, что происходит под обложками?

109
12

У меня есть ситуация здесь - в основном:

#include <iostream>

class A {
public:
virtual void foo()=0;
};

class B : A {
public:
void foo() { cout << "I hate this code." << endl; }
void DoSomething() { /* Code */ }
};

A и B находятся в разных файлах в моем случае и гораздо сложнее сказать - но вот моя проблема:

Где-то внутри класса B в функции (например, DoSomething()) я вызываю foo. Теперь foo - это чисто виртуальная функция из A, определенная в B, поэтому она отлично работает - компиляция тоже прекрасна.

Если я назову это так:

B::foo()

он отлично работает.

Если я назову это так:

foo()

Он зависает системой во время выполнения. Почему операторы обзора меняют результат, когда функция не статична или что-то в этом роде?

PS: Я написал этот код на месте и не имел компилятора для этого вопроса, поэтому извините за опечатки, если они есть.

спросил(а) 2021-01-25T13:53:57+03:00 5 месяцев назад
1
Решение
88

Код выглядит правильно. Это сильно означает, что vptr или vtable повреждены каким-либо доступом к памяти вне границ или что this указатель недействителен.

Оператор scoping изменяет вызов, позволяя ему полностью обходить поиск виртуальной функции.

ответил(а) 2021-01-25T13:53:57+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема