C ++ проблема динамического связывания - PullRequest
1 голос
/ 26 января 2011

Вопросы:
а) Является ли следующий код законным или нет? (учитывая, что во время выполнения происходит сбой)
б) Если есть какой-либо флаг компилятора для gcc или MVC для отображения во время компиляции, потенциальная проблема в следующем коде?

#include <iostream>
using namespace std;
class A
{
public:
    void write(){   cout<<"A"; }    
};
class B
{
public:
    virtual void write(){ cout<<"B"; }  
};
int main()
{

    A *pa=(A*) new B();
    pa->write();
    B *pb=(B*) new A() ;
    pb->write();

    delete pa;
    delete pb;
    return 0;
}

Спасибо!

1 Ответ

5 голосов
/ 26 января 2011

Нет, это не законно.B не является производным от A и наоборот.Принудительное приведение типа в результате приводит к неопределенному поведению.Вы говорите компилятору «заткнись, я знаю, что я делаю», что приводит к всевозможным неприятностям.Это одна из причин избегать старых приведений в стиле C и вместо этого использовать приведение в стиле C ++ (static_cast и т.

...