2013-08-24 1 views
-1

Что касается этой части коды:Разыменование typecasted аннулируется * объект указатели

#include <iostream> 

class CClass1 
{ 
public: 
    void print() { 
     std::cout << "This should print first" << std::endl; 
    } 
}; 

class CClass2 
{ 
public: 
    void print() { 
     std::cout << "This should print second" << std::endl; 
    } 
}; 

Так кто-то задали интересный вопрос о том, «свободном указатель» (так сказать), что может указывать на несколько экземпляров разных объектов, не создавая новый тип этого объекта. У человека была идея, что этот указатель может быть типа void *, и поскольку он недействителен, его можно указать на любой экземпляр объекта и получить доступ к общедоступным свойствам объекта.

следующее решение было представлено:

int main() { 
    void *pClass(NULL); 
    ((CClass1 *)(pClass))->print(); 
    ((CClass2 *)(pClass))->print(); 
    std::cin.ignore(); 
    return 0; 
} 

Мой вопрос почему вышеуказанную работу, но это не делает:

int main() { 
    (CClass1 *FG)->print(); 
    (CClass2 *FG)->print(); 
    std::cin.ignore(); 
    return 0; 
} 
+0

Первый тоже не работает. Это не указывает на правильный объект. – chris

+0

Это скомпилировано для меня, поэтому я начал экспериментировать с @chris. Именно поэтому я был поражен тем, что он работал, потому что нет реального объекта, чтобы указать на него, но он все еще печатал правильные вещи. – smac89

+0

Вы полюбите, что Компиляция - это только половина битвы, обычно легкая половина. – chris

ответ

1

Ваш первый пример демонстрирует неопределенное поведение, путем вызова не -статическая функция-член через указатель, который не указывает на действительный объект. Похоже, что это работает случайно, потому что функция, о которой идет речь, просто не использует this.

Ваш второй пример, довольно просто, синтаксически неверен. Я даже не уверен, что вы пытаетесь сделать там; код не имеет смысла.

+0

Я пытался повторить то, что делал первый код. Он не указывал на действительный объект, поэтому я решил попробовать второй код и посмотреть, что произойдет. – smac89

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

  • Нет связанных вопросов^_^