Разница между тремя явными апкастингами в частный базовый класс

У меня есть три типа приведенных ниже между частным унаследованным объектом базового класса и дочерним объектом, два из них работают, но последний — нет. Мне интересно, что вызывает разные результаты.

#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 работает? Может ли кто-нибудь объяснить механизм, стоящий за каждым из них, который имеет значение для них?

Кроме того, первый метод, кажется, создает строковый объект. В частном унаследованном случае ссылка на базовый класс не может быть установлена ​​на объект производного класса. Итак, как создается временный строковый объект?

Заранее спасибо.

3

Решение

test подклассы string в частном порядке, так test «знает» это string, но кто-то снаружи нет.

В вашем первом случае происходит следующее:

  1. Вне testmain), вы называете show метод. Это нормально, потому что это публично.

  2. Теперь внутри show, код «знает», это типа stringпотому что это метод test, Конверсия в порядке.

В третьем случае вы пытаетесь выполнить конвертацию снаружи, из main, Вне test, main «не знает», что test это string,

Как тогда работает ваш второй случай? Вы выполняете Приведение в стиле C от производной до публичной базы. Удивительно, но это разрешено (хотя не обязательно в хорошем стиле!). Цитирование из принятого ответа там: §5.4 / 7 стандарта:

… следующие операции static_cast и reinterpret_cast (необязательно сопровождаемые операцией const_cast) могут выполняться с использованием нотации приведения явного преобразования типа, даже если тип базового класса недоступен: указатель на объект типа производного класса или lvalue производного тип класса может быть явно преобразован в указатель или ссылку на однозначный тип базового класса, соответственно;

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]