必须显式解析C++内联基类方法
C++ inline base class method must be explicitly resolved?
我的类层次结构中的继承和方法解析遇到了一个奇怪的问题。代码正在用 clang++ 5.0 和 -O0
编译。我有两个这样的类:
class PrintBase
{
protected:
static wstring_convert<codecvt_utf8<wchar_t>> sConverter;
public:
virtual void PrintChar(wchar_t ch) = 0;
inline void PrintChar(char ch)
{
PrintChar(sConverter.from_bytes(ch)[0]);
}
virtual void PrintString(const wstring& str) = 0;
inline void PrintString(const string& str)
{
PrintString(sConverter.from_bytes(str));
}
};
class Print: public PrintBase
{
public:
virtual void PrintChar(wchar_t ch) override;
virtual void PrintString(const wstring& str) override;
};
void Print::PrintChar(wchar_t ch)
{
// do stuff
}
void Print::PrintString(const wstring& str)
{
// do stuff
}
如果我构造一个 Print 实例Print* pnt = new Print();
并调用pnt->PrintChar('c');
它会正确调用内联基类方法,执行转换,然后在派生类中正确调用实现的虚拟重写。
如果我拨打pnt->PrintString("test");
或pnt->PrintString(string("test"));
或pnt->PrintString(someString);
,则会收到错误:
No viable conversion from 'basic_string<char, char_traits<char>, allocator<char>>' to 'const basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>>'
。对"从"类型的恒定性有一些变化。调用pnt->PrintString(L"test");
或类似电话将按预期工作。我可以强制它调用内联字符串和函数与pnt->PrintBase::PrintString("test");
为什么它能够正确解析和调用基类中的内联 char 方法,但如果不显式解析范围,就无法对 string& 方法这样做?
您拥有的设置是隐藏其他继承重载的重写函数的典型示例。
当函数在派生类中被重写时,该重写函数会隐藏基类中的所有其他重载。 重载解析是在选择名称之后,所以一旦PrintString
被确定为引用Print::PrintString
,它永远不会考虑PrintBase::PrintString
,即使前者不接受提供的参数,而后者会。
最直接的方法是使用using
声明将继承但未重写的名称引入派生类:
class Print: public PrintBase
{
public:
virtual void PrintChar(wchar_t ch) override;
using PrintBase::PrintChar;
virtual void PrintString(const wstring& str) override;
using PrintBase::PrintString;
};
我不相信通过Print
对象调用PrintChar('x')
实际上调用了内联重载。它真正要做的是从您传入的char
初始化wchar_t
。在您的情况下,它是否有可能只做与内联版本相同的事情?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C++初始化之前派生类调用基类的方法
- 为什么派生类的实例从基类调用方法?
- 为什么允许将派生类的方法static_cast为基类的方法?
- 从基类调用继承类的方法.C++
- 我无法重写基类的方法,因为我的派生类是模板化的
- C++继承,如何在基类的方法中调用子类的方法?
- C ++中有没有办法让派生类重写基类静态方法
- 如何将模板派生类的方法提取到非模板基类中
- 将指针从派生到基类的方法的最佳方法
- 当类不需要重写从多个基继承的方法时该怎么办
- 抽象基类的派生类未正确覆盖基纯虚拟方法
- C++抽象基模板类非空方法
- CRTP:基于派生类内容的基类启用方法
- 通过"a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)
- 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包
- SWIG:在派生类中处理基类重载方法
- 在派生类的方法中使用基类的方法
- 仅通过基类"create"方法将对象创建为共享指针