必须显式解析C++内联基类方法

C++ inline base class method must be explicitly resolved?

本文关键字:基类 类方法 C++      更新时间:2023-10-16

我的类层次结构中的继承和方法解析遇到了一个奇怪的问题。代码正在用 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。在您的情况下,它是否有可能只做与内联版本相同的事情?