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