Обычное приведение не выдает ошибку во время выполнения

Если мы увидим приведенный ниже код, забавная функция преобразует объект C в объект B и вызывает собственную функцию B. Как это не дает ошибки Сегма. Я думаю, что это приведет к краху.
Моя программа не разбилась. Может кто нибудь объяснит почему работает нормально.

#include<iostream>
using namespace std;
class A{
public:
A() {cout<<"A's Con\n"; }
~A() {cout<<"A's De\n"; }
};
class B :public A
{
public:
B() {cout<<"B's Con\n"; }
~B() {cout<<"B's De\n"; }
void printb(){cout<<"B print function\n";}
void printb2(){cout<<"B print2 function\n";}
};
class C :public A
{
public:
C() {cout<<"C's Con\n"; }
~C() {cout<<"C's De\n"; }
void printc(){cout<<"C print function\n";}
};
void fun(A *ap)
{
B *bp = (B*) ap;
bp->printb2();
}

int main()
{
C c;
fun(&c);
return 0;
}

0

Решение

Вы вызываете неопределенное поведение. Первое правило о неопределенном поведении заключается в том, что может произойти все, что угодно. Ваша программа может аварийно завершить работу или может успешно работать. Это может появиться успешно работать, а затем сбой часов спустя «невозможно». Он может даже отправлять неуместные электронные письма вашему боссу или стереть ваш жесткий диск. Это, конечно, маловероятно для случайной доброкачественной ошибки, но если ваша программа, скажем, веб-браузер, она, безусловно, может быть использована для выполнения действий, которые захочет атакующий.

Никогда не полагайтесь на неопределенное поведение. Всегда исправляйте проблемы с подчиненным. Используйте такие инструменты, как Valgrind, Проверка приложения, и т.д., чтобы помочь вам обнаружить тонкие ошибки, которые не всегда приводят к сбоям. Это сделает ваше программное обеспечение более надежным в долгосрочной перспективе.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]