2017-02-09 18 views
1

Почему объект mother способен вызвать функцию father при приведении типов в son?C++ typecasting с множественным наследованием

Здесь father объект не создан, то почему придет drive() функция получает вызов. Извините за новичков.

#include <iostream> 
using namespace std; 

#include <iostream> 
using namespace std; 
class father 
{ 
    public: 
    void drive(){cout<<"Driving";} 
}; 
class mother 
{ 
    public: 
    void cook(){cout<<"Cooking";} 
}; 
class son: public father, public mother 
{ 

}; 
int main() { 
    // your code goes here 
    mother *m = new mother(); 
    son* s = static_cast<son *>(m); 
    s->drive(); 
    return 0; 
} 
+2

Использование старинной отливки не дает вам возможности проверить, что вы получаете – doctorlove

+1

Это незаконно. Это может показаться ** работать, но это не так. – BoBTFish

+1

@Coder '(son *)' заставляет компилятор принять то, что он не «вывел» сам по себе. – Scheff

ответ

2

Разыменование указатель типа son*, когда он не указывает на объект типа или полученные из son (т.е. заостренный объект имеет несовместимый тип) имеет неопределенное поведение.

Как же мать объект способен ...

поведение не определено.

3

Ваш код имеет неопределенное поведение, поскольку вы пытаетесь получить доступ к объекту типа mother через тип son, который не является динамическим типом объекта.

Более точно, [basic.lval] в стандарте говорит:

Если программа пытается получить доступ к сохраненному значению объекта через glvalue, отличных от одного из следующих типов поведение не определено:

  • динамический тип объекта,
  • вольтамперных квалифицированных варианты динамического типа объекта,
  • тип, подобный динамическому типу объекта,
  • тип, который является подписанным или неподписанным типом, соответствующим динамическому типу объекта,
  • тип, который является подписанным или неподписанным типом, соответствующим cv- квалифицированная версия динамического типа объекта,
  • тип агрегата или объединения, который включает один из вышеупомянутых типов среди его элементов или нестатических членов данных (включая рекурсивно элемент или нестатический элемент данных суммирования или содержит объединение),
  • тип, который является классом базового класса (возможно, с квалификацией) для динамического типа объекта,
  • char или unsigned char type.

cppreference.com Цитирование:

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