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

Я новичок в программировании на 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 (), но он вызывает функцию базового класса, так как я могу добиться динамического связывания для статической функции-члена.

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();
}
};
8

Другие решения

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

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

virtual void print(){...}
3

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

1

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

1
По вопросам рекламы [email protected]