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

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

#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, но кто-то снаружи нет.

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

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

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

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

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

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

Другие вопросы по тегам