[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Скажите плиз, почему не вызывается виртуальная функция? После запуска кода вылезает ошибка.

    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, ""); // что тут не так?
    }
    
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Это вообще что? Тут же вызов функции виртуальной не привязан к объекту класса вообще как бы. За такой код надо пороть плеткой, смоченной в соленой воде, особенно за упоротые си-стайл касты.

    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 (*)

        
    SomeClassobj = new SomeClass;
        (
    obj->*my_memfunc_ptr)(1,"11");
        
    delete obj;
        
        
    obj = new DerivedClass;
        (
    obj->*my_memfunc_ptr)(1,"11");
        
    delete obj;
    }
     
  3. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Спасибо, мне было интересно, можно ли вызывать виртуальную функцию без привязки к объекту.
     
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Нельзя, можно только статическую. На будущее - для кастов в С++ используются dynamic_cast, static_cast и т.п.
     
  5. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Вроде никакой разницы нету )
     
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Разница в том, что код становится более читаемым, а касты C++ каждый имеет свое собственное назначение. Скажем, dynamic_cast для приведения типов по ссылкам или указателям умеет в случае ссылок при неудачном преобразовании выбрасывать исключение bad_cast. Сишные касты рассчитаны на минимум типизации, и поэтому их использование чревато ошибками, которые обнаружатся в процессе исполнения программы только.

    Кстати, если бы ты не использовал сишные касты в своих экспериментах, у тебя бы даже ничего не скомпилировалось. А так ты получил неработающую программу и глупые вопросы.
     
    #6446 GRRRL Power, 29 May 2011
    Last edited: 29 May 2011
  7. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Касты C++ очень длинные, если в коде имеются приведения в стиле: "*(int *)((char *)pEntity + offset) = health;" то я предпочитаю сишные касты )
     
  8. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Если в коде такие касты, то это говорит о плохом качестве кода. Писал достаточно большие и сложные проекты, там даже двойных кастов не встречалось.

    Вот касательно этого примера - это дважды reinterpret_cast, если переводить в C++. А это очень плохо.
     
  9. cipa21

    cipa21 Elder - Старейшина

    Joined:
    9 Apr 2009
    Messages:
    548
    Likes Received:
    146
    Reputations:
    30
    Вопрос школьника.
    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" без существенного изменения кода? Видимо что-то пропустил на уроке, не пойму что....
     
  10. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    PHP:
    cifra static_cast<unsigned char>(bukva);
     
    1 person likes this.
  11. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    У меня появился вопрос: можно ли каким-то низкоуровненным способом вызвать виртуальную функцию объекта? В голову пришел этот код, но при запуске программы вылезает ошибка.
    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;
    }
    Зы. Ссылка на таблицу виртуальных функций находится по нулевому смещению, вроде.

    Зызы. Все, решил проблему, надо было хорошенько подумать :D

    Code:
    f func = reinterpret_cast<f>(*reinterpret_cast<void***>(&obj)[0]); 
    func();
     
    #6451 enk, 29 May 2011
    Last edited: 29 May 2011
  12. AGIMgal

    AGIMgal New Member

    Joined:
    9 Jun 2010
    Messages:
    66
    Likes Received:
    0
    Reputations:
    0
    сори за глупейший вопрос, но чем можно скопилировать hello world?
    Code:
    #include 
    <stdio.h>  int main()
      { 
         printf("Hello, World!\n");     
     return 0;
      }
    или
    Code:
     main() {  printf("Hello, World!\n");  }
    это то что написано в википендии

    тока нужно чтото прямое и конкертное, желательно ссылка.
     
  13. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Любым компилятором сишным. GCC, MinGW, Visual Studio, Borland C++ и т.п. Всё гуглится, но не всё бесплатное.
     
  14. AGIMgal

    AGIMgal New Member

    Joined:
    9 Jun 2010
    Messages:
    66
    Likes Received:
    0
    Reputations:
    0
    борланд вроде есть, тока билдер, как на консоль перевести?
     
  15. Gervorovski

    Gervorovski Banned

    Joined:
    28 Sep 2010
    Messages:
    159
    Likes Received:
    12
    Reputations:
    0
    ПС в помощь:
    http://lehrer.at.ua/publ/ubuntu_10_10/programmirovanie/makefile_kak_skompilirovat_svoj_pervyj_hello_world/4-1-0-2
     
  16. AGIMgal

    AGIMgal New Member

    Joined:
    9 Jun 2010
    Messages:
    66
    Likes Received:
    0
    Reputations:
    0
    это чтото всё не то
    например знакомство с паскалем начал в 7 классе с "паскаль ABC", есть чтото на Си или С++ настолько же простое?
     
  17. Nelz.

    Nelz. Member

    Joined:
    2 Aug 2010
    Messages:
    151
    Likes Received:
    7
    Reputations:
    0
    ну так сиди пиши на АВС вчем проблема)
    Си/С++ не простой язык,чтоб считать их простим :rolleyes:
     
  18. AGIMgal

    AGIMgal New Member

    Joined:
    9 Jun 2010
    Messages:
    66
    Likes Received:
    0
    Reputations:
    0
    так хотелось с чего то начать
    зы. щас делфи)
     
  19. Thenno

    Thenno Member

    Joined:
    3 Jul 2009
    Messages:
    77
    Likes Received:
    21
    Reputations:
    0
    Code::Blocks достаточно простая среда.
     
  20. ChazAshley

    ChazAshley New Member

    Joined:
    1 Jun 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    подскажите, где можно скачать нормальный компилятор, чтобы присутствовали файлы <sys/socket.h> <netinet/in.h>? а то эксплоиты не компилятся(
     
Thread Status:
Not open for further replies.