2016-09-01 2 views
3

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

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

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

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

+0

Вы не можете действительно наследовать наследование с прямыми значениями. Обычно это работает только с указателями и ссылками. '* this' является' const & ', поэтому он« работает »здесь. то же самое для 'string &'. Но вы не можете отличить один тип от другого с использованием прямых значений. Я также не уверен, что ваши броски имеют некоторые отрицательные побочные эффекты в какой-то момент (приведение ref к значению и наоборот). Также для других: я понимаю, что это тестовый код, но, пожалуйста, не используйте код в реальных проектах;) – Hayt

+0

Большое спасибо. Могу ли я спросить, как создается временная строка obj, когда ссылка базового класса не может быть установлена ​​на объект производного класса? Не скрывает ли он '* this' как ссылку на базовый класс, когда мы делаем явное повышение? Кроме того, я не буду делать этого в реальном проекте :) Я наткнулся на него с помощью опечатки. –

+0

Вы упомянули '* this' это' const & 'type.Не могли бы вы указать мне некоторые рекомендации. Мне жаль, что я искал его, но не нашел соответствующую информацию (возможно, потому, что ключевые слова слишком широко используются.) Спасибо –

ответ

2

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

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

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

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

В вашем третьем случае, хотя, вы пытаетесь сделать преобразование извне, из main. Вне test, main «не знает», что test является string.

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

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

+0

Спасибо Могу ли я спросить, как создается временная строка obj, когда ссылка базового класса не может быть установлена ​​на объект производного класса? Это также потому, что внутри класса «test» они знают наследование, поэтому базовая ссылка класса может быть установлена к частному производному объекту класса? –

+0

@FlowingCloud Вы говорите о первом случае? –

+0

да, я говорил о первом случае. Спасибо –

Смежные вопросы