У меня есть следующие три типизации между частным унаследованным объектом базового класса и дочерним объектом, два из которых работают, а последний - нет. Мне интересно, что вызывает разные результаты.Разница между тремя явными восходящими потоками для частного базового класса
#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 работает?
Если это из-за объема, то почему No.2 работает? Может ли кто-нибудь объяснить механизм, лежащий в основе каждого из них, который делает разницу между ними?
Кроме того, первый метод, похоже, создает строковый объект. В частном унаследованном случае ссылка базового класса не может быть установлена на объект производного класса. Итак, как создается временный строковый объект?
Заранее спасибо.
Вы не можете действительно наследовать наследование с прямыми значениями. Обычно это работает только с указателями и ссылками. '* this' является' const & ', поэтому он« работает »здесь. то же самое для 'string &'. Но вы не можете отличить один тип от другого с использованием прямых значений. Я также не уверен, что ваши броски имеют некоторые отрицательные побочные эффекты в какой-то момент (приведение ref к значению и наоборот). Также для других: я понимаю, что это тестовый код, но, пожалуйста, не используйте код в реальных проектах;) – Hayt
Большое спасибо. Могу ли я спросить, как создается временная строка obj, когда ссылка базового класса не может быть установлена на объект производного класса? Не скрывает ли он '* this' как ссылку на базовый класс, когда мы делаем явное повышение? Кроме того, я не буду делать этого в реальном проекте :) Я наткнулся на него с помощью опечатки. –
Вы упомянули '* this' это' const & 'type.Не могли бы вы указать мне некоторые рекомендации. Мне жаль, что я искал его, но не нашел соответствующую информацию (возможно, потому, что ключевые слова слишком широко используются.) Спасибо –