2013-05-15 1 views
7

Я новичок в программировании на C++, у меня есть сомнения в выполнении некоторых программ на C++, то есть как добиться динамического связывания для статической функции-члена. динамическое связывание нормальных функций-членов может быть достигнуто путем объявления функций-членов как виртуальных, но мы не можем объявлять статические функции-члены как виртуальные, поэтому, пожалуйста, помогите мне. и смотрите пример ниже:статические функции-функции наследования

#include <iostream> 
#include <windows.h> 
using namespace std; 

class ClassA 
{ 
    protected : 
    int width, height; 
    public: 
    void set(int x, int y) 
    { 
     width = x, height = y; 
    } 
    static void print() 
    { 
     cout << "base class static function" << endl; 
    } 
    virtual int area() 
    { 
     return 0; 
     } 
}; 

class ClassB : public ClassA 
{ 
    public: 
    static void print() 
    { 
    cout << "derived class static function" << endl; 
    } 
    int area() 
    { 
    return (width * height); 
    } 
}; 

int main() 
{ 
    ClassA *ptr = NULL; 
    ClassB obj; 
    ptr = &obj ; 
    ptr->set(10, 20); 
    cout << ptr->area() << endl; 
    ptr->print(); 
    return 0; 
} 

В приведенной выше коде я назначил Производный объект класса к указателю и вызвать функцию печать статического члена(), но он звонит базовый класс функцию, так как я могу достичь динамического bind для статической функции-члена.

ответ

7

Динамическое связывание, которое вы хотите, является нестатическим поведением.

Динамическое связывание является связывание на основе this указателя и static функции по определению не нуждается или требует this указателя.

Предполагая, что вам необходимо, чтобы функция была статичной в других ситуациях (в вашем примере она не обязательно должна быть статичной), вы можете обернуть статическую функцию в нестатической функции.

class ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassA::print(); 
    } 
}; 

class ClassB : public ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassB::print(); 
    } 
}; 
+0

приятно! мне это нравится. –

1

Динамическое связывание не имеет большого смысла, поскольку вам даже не нужен объект для вызова статической функции.

1

Вы не можете использовать статические методы как виртуальные. Просто сделайте метод печати виртуальным (как метод области). Это послужит вашей цели.

3

Итак, у вас есть две проблемы, во-первых, вы не можете использовать наследование со статическими функциями. Во-вторых, вам не хватает ключевого слова virtual, чтобы сообщить компилятору, что эта функция может быть переопределена дочерними классами.

Предположим, вы исправите статическую проблему.

virtual void print(){...} 

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

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