Скажите плиз, почему не вызывается виртуальная функция? После запуска кода вылезает ошибка. Code: #include <stdio.h> #include <iostream> #include <vector> using namespace std; class SomeClass { public: virtual void some_member_func(int x, char *p) { printf("In SomeClass"); }; }; class DerivedClass : public SomeClass { public: // If you uncomment the next line, the code at line (*) will fail! // virtual void some_member_func(int x, char *p) { printf("In DerivedClass"); }; }; int main() { // Declare a member function pointer for SomeClass typedef void (*function)(int, char*); typedef void (SomeClass::*SomeClassMFP)(int, char *); SomeClassMFP my_memfunc_ptr; my_memfunc_ptr = &DerivedClass::some_member_func; // ---- line (*) (*(function)(*(void**)(&my_memfunc_ptr)))(10, ""); // что тут не так? }
Это вообще что? Тут же вызов функции виртуальной не привязан к объекту класса вообще как бы. За такой код надо пороть плеткой, смоченной в соленой воде, особенно за упоротые си-стайл касты. PHP: class SomeClass { public: virtual void some_member_func(int x, const char *p) const { printf("In SomeClass\n"); } virtual ~SomeClass() {} }; class DerivedClass : public SomeClass { public: virtual void some_member_func(int x, const char *p) const { printf("In DerivedClass\n"); } }; int main() { // Declare a member function pointer for SomeClass typedef void (SomeClass::*SomeClassMFP)(int, const char *) const; SomeClassMFP my_memfunc_ptr; my_memfunc_ptr = &SomeClass::some_member_func; // ---- line (*) SomeClass* obj = new SomeClass; (obj->*my_memfunc_ptr)(1,"11"); delete obj; obj = new DerivedClass; (obj->*my_memfunc_ptr)(1,"11"); delete obj; }
Нельзя, можно только статическую. На будущее - для кастов в С++ используются dynamic_cast, static_cast и т.п.
Разница в том, что код становится более читаемым, а касты C++ каждый имеет свое собственное назначение. Скажем, dynamic_cast для приведения типов по ссылкам или указателям умеет в случае ссылок при неудачном преобразовании выбрасывать исключение bad_cast. Сишные касты рассчитаны на минимум типизации, и поэтому их использование чревато ошибками, которые обнаружатся в процессе исполнения программы только. Кстати, если бы ты не использовал сишные касты в своих экспериментах, у тебя бы даже ничего не скомпилировалось. А так ты получил неработающую программу и глупые вопросы.
Касты C++ очень длинные, если в коде имеются приведения в стиле: "*(int *)((char *)pEntity + offset) = health;" то я предпочитаю сишные касты )
Если в коде такие касты, то это говорит о плохом качестве кода. Писал достаточно большие и сложные проекты, там даже двойных кастов не встречалось. Вот касательно этого примера - это дважды reinterpret_cast, если переводить в C++. А это очень плохо.
Вопрос школьника. Code: char bukva; cout<<"\t\t Введите любую букву "; int cifra; cin>>bukva; cifra=bukva; cout<<"\t\t "<<bukva<<" = "<<cifra<<endl; При вводе буквы русской буквы "м" , консоль выдает значение -20. При попытке обрезать "-" с помощью unsigned выдает совершенно иное значение "4294967276". Code: char bukva; cout<<"\t\t Введите любую букву "; unsigned int cifra; cin>>bukva; cifra=bukva; cout<<"\t\t "<<bukva<<" = "<<cifra<<endl; ] Так вот вопрос, как получить положительное значение "20" без существенного изменения кода? Видимо что-то пропустил на уроке, не пойму что....
У меня появился вопрос: можно ли каким-то низкоуровненным способом вызвать виртуальную функцию объекта? В голову пришел этот код, но при запуске программы вылезает ошибка. Code: class A { public: virtual void foo() { printf("Hello"); }; }; int main() { typedef void (*f)(); A obj; f func = reinterpret_cast<f>(reinterpret_cast<void**>(&obj)[0]); func(); getchar(); return 0; } Зы. Ссылка на таблицу виртуальных функций находится по нулевому смещению, вроде. Зызы. Все, решил проблему, надо было хорошенько подумать Code: f func = reinterpret_cast<f>(*reinterpret_cast<void***>(&obj)[0]); func();
сори за глупейший вопрос, но чем можно скопилировать hello world? Code: #include <stdio.h> int main() { printf("Hello, World!\n"); return 0; } или Code: main() { printf("Hello, World!\n"); } это то что написано в википендии тока нужно чтото прямое и конкертное, желательно ссылка.
Любым компилятором сишным. GCC, MinGW, Visual Studio, Borland C++ и т.п. Всё гуглится, но не всё бесплатное.
ПС в помощь: http://lehrer.at.ua/publ/ubuntu_10_10/programmirovanie/makefile_kak_skompilirovat_svoj_pervyj_hello_world/4-1-0-2
это чтото всё не то например знакомство с паскалем начал в 7 классе с "паскаль ABC", есть чтото на Си или С++ настолько же простое?
подскажите, где можно скачать нормальный компилятор, чтобы присутствовали файлы <sys/socket.h> <netinet/in.h>? а то эксплоиты не компилятся(