Я новичок в программировании на 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;
}
В приведенном выше коде я назначил объект класса Derived указателю и вызвал статическую функцию-член print (), но он вызывает функцию базового класса, так как я могу добиться динамического связывания для статической функции-члена.
Нужная динамическая привязка — это нестатическое поведение.
Динамическое связывание является обязательным на основе 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(){...}
Динамическое связывание не имеет особого смысла, так как вам даже не нужен объект для вызова статической функции.
Вы не можете сделать статические методы виртуальными. Просто сделайте метод печати как виртуальный (так же, как метод области). Это послужит вашей цели.