gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:41:18 26 4
gpt4 key购买 nike

我的类层次结构中的继承和方法解析有一个奇怪的问题。代码正在使用带有 -O0 的 clang++ 5.0 进行编译。我有两个这样的类:

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方法,而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。它是否有可能与您的情况下的内联版本做同样的事情?

关于C++ 内联基类方法必须显式解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com