У меня есть три типа приведенных ниже между частным унаследованным объектом базового класса и дочерним объектом, два из них работают, но последний — нет. Мне интересно, что вызывает разные результаты.
#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 работает? Может ли кто-нибудь объяснить механизм, стоящий за каждым из них, который имеет значение для них?
Кроме того, первый метод, кажется, создает строковый объект. В частном унаследованном случае ссылка на базовый класс не может быть установлена на объект производного класса. Итак, как создается временный строковый объект?
Заранее спасибо.
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) могут выполняться с использованием нотации приведения явного преобразования типа, даже если тип базового класса недоступен: указатель на объект типа производного класса или lvalue производного тип класса может быть явно преобразован в указатель или ссылку на однозначный тип базового класса, соответственно;
Других решений пока нет …