Разница между тремя явными апкастингами в частный базовый класс
У меня есть три типа приведенных ниже между частным унаследованным объектом базового класса и дочерним объектом, два из них работают, но последний - нет. Мне интересно, что вызывает разные результаты.
#include<iostream>
#include <string>
using namespace std;
class test :private string
{
public:
test(string st) :string(st){}
void show();
};
void test::show()
{
cout << (string)*this << endl; // typecasting 1, works, display "abcd"
}
int main()
{
test a("abcd");
a.show();
cout << (string &)a << endl; //typecasting 2, works, display "abcd"
cout<<(string )a<<endl; //typecasting 3; error C2243: 'type cast' : conversion from 'test *' to 'const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &' exists, but is inaccessible
}
не a
так же, как "* это" - так как оба являются объектами? Так почему же № 1 работает?
Если это из-за объема, то почему № 2 работает? Может ли кто-нибудь объяснить механизм, стоящий за каждым из них, который имеет значение для них?
Кроме того, первый метод, кажется, создает строковый объект. В частном унаследованном случае ссылка на базовый класс не может быть установлена на объект производного класса. Итак, как создается временный строковый объект?
Заранее спасибо.
1 ответ
test
подклассы string
в частном порядке, так test
"знает" это string
, но кто-то снаружи нет.
В вашем первом случае происходит следующее:
Вне
test
(вmain
), вы называетеshow
метод. Это нормально, потому что это публично.Теперь внутри
show
, код "знает", это типаstring
потому что это методtest
, Конверсия в порядке.
В третьем случае вы пытаетесь выполнить конвертацию снаружи, из main
, Вне test
, main
"не знает", что test
это string
,
Как тогда работает ваш второй случай? Вы выполняете приведение в стиле C от производной до публичной базы. Удивительно, но это разрешено (хотя не обязательно в хорошем стиле!). Цитирование из принятого ответа там: §5.4/7 стандарта:
... следующие операции static_cast и reinterpret_cast (необязательно сопровождаемые операцией const_cast) могут выполняться с использованием нотации приведения явного преобразования типа, даже если тип базового класса недоступен: указатель на объект типа производного класса или Значение типа производного класса может быть явно преобразовано в указатель или ссылку на однозначный тип базового класса, соответственно;