Ответ 1
В этом конкретном случае я считаю, что он всегда знал, что кастинг будет вверх, и поэтому static_cast
должен быть абсолютно безопасным.
Похоже, что использование implicit_cast
, возможно, будет более безопасным и позволит вам явно выбрать, какой базовый класс вы хотите неявно использовать (что, по-видимому, требуется для COM).
Я сделал быстрый тест с g++ и implicit_cast
действительно возвращает разные адреса для разных базовых классов, как и ожидалось.
Обратите внимание, что в отношении вашего самого первого предложения я бы сказал, что dynamic_cast
на самом деле безопаснее, чем static_cast
, поскольку он возвращает null или throw, если приведение не может быть завершено. Напротив, static_cast
вернет действительный указатель и позволит вам продолжать работу до тех пор, пока ваша программа не взорвется в какое-то время в будущем, не связанная с оригинальным плохим литом.
Программа тестирования:
#include <iostream>
class B1
{
public:
virtual ~B1() {}
};
class B2
{
public:
virtual ~B2() {}
};
class Foo : public B1, public B2
{
};
template<class T, class U>
T implicit_cast(U p) { return p; }
int main()
{
Foo* f = new Foo;
void **ppv = new void*;
*ppv = implicit_cast<B1*>(f);
std::cout << *ppv << std::endl;;
*ppv = implicit_cast<B2*>(f);
std::cout << *ppv << std::endl;;
return 0;
}