C++继承问题,无法调用基类中定义的公共函数
C++ inheritance issue, cannot call public function defined in base class
我有一个C++类Logger,它实现Logger_IF,它定义了一个纯虚拟函数:
virtual void log( string message ) = 0;
我想用Logger自己的接口将它扩展到我自己的类。我已经将我的类称为SpecialLogger,它扩展了SpecialLogger_IF。SpecialLogger_IF本身扩展了Logger。我已经定义:
virtual void log( string message, string extra ) = 0;
在我的SpecialLogger_IF类上。据我所知,我仍然可以通过SpecialLogger_IF调用日志("message")以及日志("message"、"extra"),但我无法使其工作。
#include <iostream>
using namespace std;
class Logger_IF
{
public:
virtual void log( string message ) = 0;
virtual ~Logger_IF() {};
};
class Logger : public Logger_IF
{
public:
void log( string message )
{
this->out( message );
}
protected:
void out( string message )
{
cout << "LOG: " << message << endl;
}
};
class SpecialLogger_IF : public Logger
{
public:
virtual void log( string message, string extra ) = 0;
virtual ~SpecialLogger_IF() {};
};
class SpecialLogger : public SpecialLogger_IF
{
public:
void log( string message, string extra )
{
this->out( message );
this->extra( extra );
}
private:
void extra( string extra )
{
cout << "^ EXTRA: " << extra << endl;
}
};
int main( int argc, char *argv[] )
{
Logger_IF* logger = new Logger();
logger->log( "message" );
delete logger;
SpecialLogger_IF* spLogger = new SpecialLogger();
spLogger->log( "message" );
spLogger->log( "message", "extra" );
delete spLogger;
}
我得到以下错误:
testing.cpp:62:27: error: too few arguments to function call, expected 2, have 1
spLogger->log( "message" );
~~~~~~~~~~~~~ ^
testing.cpp:34:3: note: 'log' declared here
virtual void log( string message, string extra ) = 0;
^
1 error generated.
有趣的是,在void log( string message, string extra )
内部调用this->out( message )
确实有效,因此正在进行一些继承。
我所做的是正确和可能的,还是我遗漏了什么。
问候
Al
您的问题是,您的双参数函数在基类中隐藏了单参数版本(这是语言设计有意为之,因为它可以防止更多的问题)。
幸运的是,您可以使用using
来修复此问题:在双参数日志函数声明的正下方,只需编写using Logger::log;
。
正如您所做的,我浏览了gcc手册页,对于这个确切的问题有一个方便的警告:
-Woverloaded-virtual
它返回
test.cpp:17:14: warning: ‘virtual void Logger::log(std::string)’ was hidden [-Woverloaded-virtual]
void log( string message )
^
test.cpp:34:22: warning: by ‘virtual void SpecialLogger_IF::log(std::string, std::string)’ [-Woverloaded-virtual]
virtual void log( string message, string extra ) = 0;
^
关于上述代码。
Al
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数