Я использую C++ для небольшого приложения. У меня есть один родительский класс, который имеет виртуальный метод. Здесь это заголовочный файл.Как определить статическую функцию, унаследованную от виртуальной?
class personDB:public person
{
public:
unsigned int id;
public:
personDB();
personDB(QString dbName, QString dbSurname);
personDB(QString dbName, QString dbSurname, unsigned int dbid);
personDB(std::string dbName, std::string dbSurname, unsigned int dbid);
virtual std::string getTableName();
unsigned int getID(void);
void setID(unsigned int myID);
private:
static const std::string tableName;
};
Этот класс унаследован различными дочерними классами. Каждый дочерний класс переопределяет атрибут tableName
, назначая другое значение в файле * .cpp. Атрибут является закрытым и возвращается получателем. В качестве примера одного из дочерних классов здесь есть заголовочный файл:
#include "persondb.h"
class ScriptBy : public personDB
{
public:
ScriptBy();
ScriptBy(QString dbName, QString dbSurname);
ScriptBy(QString dbName, QString dbSurname, unsigned int dbid);
std::string getTableName();
protected:
static const std::string tableName;
};
Я хочу сделать функцию getTableName() функцию-член класса, так что она возвращает то же значение для всех экземпляров одного и того же класса и может быть вызвана даже без экземпляра класса. Это нужно сделать, поставив ключевое слово static
перед объявлением функции в заголовочном файле, если я не ошибаюсь. Однако, когда я пытаюсь скомпилировать таким образом, это приводит к ошибке, связанной с тем, что функция родительского класса была объявлена виртуальной. Ошибки я получаю это:
In file included from ../../singlestory.h:4:0,
from ../../volume.h:5,
from ../../dbinterface.h:8,
from ../../dbinterface.cpp:1:
../../scriptby.h:12:24: error: ‘static std::__cxx11::string ScriptBy::getTableName()’ cannot be declared
static std::string getTableName();
^
In file included from ../../dbinterface.h:7:0,
from ../../dbinterface.cpp:1:
../../persondb.h:15:25: error: since ‘virtual std::__cxx11::string personDB::getTableName()’ declared in base class
virtual std::string getTableName();
Есть ли способ, чтобы сделать наследуются функция члена класса статической?
EDIT: Если я не могу сделать статическую функцию, как я могу сделать доступным внешний атрибут снаружи без экземпляра класса (и держать его закрытым)?