ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

必须明确解析C内联基类方法?

2019-08-31 03:09:12  阅读:173  来源: 互联网

标签:c c11 inline clang inheritance


我的类层次结构中的继承和方法解析存在一个奇怪的问题.该代码正在使用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>>'

…对“from”类型的常量有一些变化.调用pnt-> PrintString(L“test”);或者类似的东西会像人们期望的那样工作.我可以强制它调用内联字符串&功能与pnt-> PrintBase :: PrintString(“test”);

为什么它能够正确地解析并调用基类中的内联char方法,但是无法对字符串&没有明确解析范围的方法?

解决方法:

您拥有的设置是隐藏其他继承重载的重写函数的典型示例.

在派生类中重写函数时,该重写函数会隐藏基类中的所有其他重载.选择名称后会出现重载分辨率,因此一旦确定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.它是否可能与你的情况下的内联版本做同样的事情?

标签:c,c11,inline,clang,inheritance
来源: https://codeday.me/bug/20190831/1772522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有