【发布时间】:2010-07-06 11:58:27
【问题描述】:
我有以下类,Base 和 Derived,当我编译时编译器抱怨它无法创建 DLog 的实例,因为它是抽象的。
谁能告诉我如何解决这个错误?
我猜是因为不是两个纯虚函数都没有在派生中实现。
class Logger
{
public:
virtual void log(int debugLevel, char* fmt, ...) = 0;
virtual void log(string logText, int debugLevel, string threadName = "") = 0;
static Logger* defaultLogger() {return m_defaultLogger;}
static void setDefaultLogger(Logger& logger) {m_defaultLogger = &logger;}
protected:
static Logger* m_defaultLogger;
};
class DLog : public Logger
{
public:
DLog();
~DLog();
static DLog *Instance();
static void Destroy();
void SetLogFilename(std::string filename);
void SetOutputDebug(bool enable);
std::string getKeyTypeName(long lKeyType);
std::string getScopeTypeName(long lScopeType);
std::string getMethodName(long lMethod);
virtual void log(string logText, int debugLevel)
{
Log(const_cast<char*>(logText.c_str()));
}
void Log(char* fmt, ...);
private:
static DLog *m_instance;
std::string m_filename;
bool m_bOutputDebug;
};
// DLog 实例化为单例
DLog *DLog::Instance()
{
if (!m_instance)
m_instance = new DLog();
return m_instance;
}
【问题讨论】:
-
显然,您需要在派生类中实现 PVF。
-
拜托拜托,不要用省略号重载函数。将为您节省数小时的头发拉扯和深夜调试。
-
@Alex:不是超载......它的大写 L 是 Log 函数。其他都是小写...
-
但是
log方法有两个重载,一个带有省略号。请改用 Boost.Format 或类似技术。
标签: c++ abstract-class pure-virtual