У меня есть довольно большой проект с несколькими интерфейсами и реализациями. Код был реализован в среде linux с использованием g ++ (5.4, я думаю). После переноса кода в Windows и запуска его с помощью VS15 (MSVC v140) я получил нарушение прав доступа после попытки доступа к литому указателю.Нарушение прав доступа C++ в msvc, но не gcc для множественного наследования и литья
Это иерархия наследования в коде ниже:
A
/\
virtual / \
/ |
B |
| | virtual
C |
| |
\ /
\ /
D
В реальном коде дизайн наследования включает в себя несколько классов, так, пожалуйста, не придираться, почему это так, как я наследовать от A
. Я сузил код, чтобы представить только то, что необходимо.
Следующие работает с НКУ и печатает foo called
дважды (Live demo on rextester), но с MSVC на втором вызове foo
аварий с нарушением доступа (Live demo on rextester)
#include <iostream>
class A{};
class B : public virtual A{};
class C : public B
{
public:
virtual void foo() = 0;
};
class D : public virtual A, public C
{
public:
bool convert(int id, B** ext)
{
if (id == 1)
{
*ext = (C*)this;
return true;
}
if (id == 42)
{
C** pp_ext = (C**)(ext);
*pp_ext = (C*)this;
return true;
}
return false;
}
void foo() override
{
std::cout << "foo called" << std::endl;
}
};
int main()
{
D s;
C* foo_ext = nullptr;
s.convert(42, (B**)&foo_ext);
foo_ext->foo();
foo_ext = nullptr;
s.convert(1, (B**)&foo_ext);
foo_ext->foo();
return 0;
}
Первый - Я пропускаю фундаментальную ошибку в *ext = (C*)this;
преобразования?
Второй - Почему этот код отличается от двух компиляторов?
EDIT:
Этот код использует указатели, указатели на указатели и построен с этим наследование по уважительным причинам (одна из которых является ABI совместимый интерфейс).
dynamic_cast
не изменяет поведение в этом случае.Если я позвоню
static_cast<C*>(*ext)->foo();
после*ext = (C*)this;
, он вызовет foo, но не будет возвращен сconvert
. Это то, что я уже понял, и это заставило меня понять, что решение для42
является (хорошим?) Решением.
Прекратить использование c-style cast и слишком много звезд. – LogicStuff
http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used – LogicStuff
И это не повод для голосования вопрос. – ZivS