наследование статических функций-членов


Я новичок в программировании на 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;
}

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

4 7

4 ответа:

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

динамическая привязка основана на указателе 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();
     }
};

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

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

virtual void print(){...}

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

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