2014-01-23 5 views
-2

Допустим, у нас есть два класса:dynamic_cast: Два класса, которые имеют почти одинаковые методы

class A: 
{ 
    A(int a); // c'tor 
    virtual ~A(); // d'tor 
    FirstMethod(...); 
    SecondMethod(...); 
} 

class B:public A 
{ 
    B(int a); // c'tor 
    ~B(); // d'tor 
    FirstMethod(...); 
    SecondMethod(...); 
} 

двух классов А и В имеют те же методы (то же имя и параметры, но не обязательно же функциональность) и члены, за исключением имени деструктора и имени конструктора, которые отличаются. Теперь, скажем, у нас есть объект:

A* aObject = new A(); 

и мы делаем:

B* bObject= dynamic_cast<B*>(aObject); 

преуспеет последний кастинг или что bObject будет NULL? или, другими словами, может ли программа различать объекты типа A * и объекты типа B *?

+0

Вы всегда можете проверить, не является ли он плохим указателем или поймать 'std :: bad_cast'. Поэтому я бы перефразировал ваш вопрос. Еще одно замечание, ваш код не компилируется. Деструкторы не могут иметь аргументов. –

+0

Мой плохой ответ, не задумываясь, и он удаляется. Фактически, 'dynamic_cast' не связан с 'тем же базовым классом'. Он используется для приведения указателей из базового класса в производный класс, а не между производными классами. – xis

+0

@ Xiaoge Su, вопрос редактируется, B должен был быть получен из A – user2750466

ответ

4

Будет ли последнее кастинг успешным или что bObject будет NULL?

Это будет NULL. Динамическое литье магически не создает B. Это дает вам только B*, если у вас есть фактический B. Здесь у вас есть только A.

+0

Я знаю, что это странно, я не знаю, почему, но я думал, что процессор не может сказать разницу между A и B, потому что они точно такие же, кроме имен (и имена c'tor и d'tor).Итак, в том случае, когда B получается из A, (A имеет виртуальный метод), будет ли возвращаемое значение dynamic_cast равным NULL? – user2750466

+0

@ user2750466: Если ваш компьютер не может определить разницу между 'A' и' B', тогда вы находитесь в целой куче неприятностей ... –

1

Динамический откат не удастся, но скомпилировать его не удастся. Я знаю ваше намерение, но я думаю, что вы пытаетесь написать dynamic_cast (aObject) вместо того, чтобы пытаться использовать тип. Это сбой компиляции. Но после получения исправления динамический прилив все равно будет терпеть неудачу, потому что aObject не относится к типу B * (он не прошел тест is-a). Для его работы B должен быть получен из A.

+0

B является производным от A, но мой вопрос в том, был ли он A, и мы пытаемся отбросить его в B, будет ли это успешным или неудачным? – user2750466

+0

Нет, B не является производным от A. Это может быть ваше намерение, но это не так, на основе вашего фрагмента кода. Для вашего вышеизложенного комментария никакие броски все равно не сработают, так как A не является B, хотя B может быть A. –

+0

@Paul Dardeau, я отредактировал вопрос – user2750466

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