【发布时间】:2017-07-03 10:44:57
【问题描述】:
我将 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 文件中分配不同的值。该属性是私有的,由 getter 返回。
作为子类之一的示例是头文件:
#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();
有没有办法让继承的类成员函数变成静态的?
编辑:如果我不能将函数设为静态,如何在没有类实例的情况下使私有属性在外部可访问(并保持私有)?
【问题讨论】:
标签: c++ inheritance static virtual-functions