Да уже объяснял:
C++ |
1
2
3
4
5
6
7
8
| A1 *a1 = new A1(); //создается указатель a1 на объект A1 (A1() - это вызов конструктора типа А1)
A1 *a2 = new A2();//а тут уже для указателу на базовый класс A1 присваивается адрес объекта производного класса А2, по правилам можно указателю базового класса присвоить указатель на производный класс.
A2 *test = 0; //создается указатель на тип (класс) А2, которому присваивается 0 (указывает ни на что)
test = dynamic_cast< A2 * >( a1 ); //а здесь происходит динамическое преобразование типа, так как указатель а1 указывает на тип А1, которые не есть А2, то test будет равен 0, тоесть преобразования не произойдет.
if ( test != 0 )
std::cout << "a1 is A2 object" << std::endl;
else
std::cout << "a1 is not A2 object" << std::endl;//эта строчка выведется потому что a1 не А2 |
|
Добавлено через 1 минуту
если бы в dynamic_cast попало б не а1, а а2, то тогдаб test* не равнялось бы нулю
C++ |
1
| test = dynamic_cast< A2 * >( a2 );//если так то test будет указывать на объект по моему новый я уже точно не помню либо просто старый на который указывает а2 тип А1 ,будет преобразован просто в тип А2. Точно я тут не уверен но думаю просто будет преобразование. Значения test и а2 будут равны, то есть они будут указывать на один и тот же адрес. |
|
Если б так было.
Добавлено через 34 секунды
Тебе если ты нулевой строчкой не объяснишь, там целая глава по RTTI