【发布时间】:2022-01-04 20:56:01
【问题描述】:
我可能只是忽略了某些事情或愚蠢,在这种情况下我很抱歉,但我真的不确定如何(如果可能的话)访问虚拟成员函数。实际上,虚拟部分是关于可能的解决方案的第二个问题,我将在后面描述。这是一些总结我的问题的示例代码:
class BaseClass
{
public:
virtual std::string ClassName()
{
return "BaseClass";
}
};
class DerivedClass : public BaseClass
{
public:
std::string ClassName()
{
return "DerivedClass";
}
};
template<class cT>
void StatusPrint(const std::string& message)
{
return cT.ClassName(); // Here's where my issue arises.
}
所以,我尝试用ct:: 替换cT.,然而,虽然这会导致编译器问题,但它也尝试访问BaseClass 中的虚函数,但我想访问DerivedClass 中的覆盖函数。
我正在尝试做的事情可能像这样吗?
【问题讨论】:
-
尝试返回 cT().ClassName();请注意该函数的返回类型为 void。所以它的 return 语句不应该返回一个表达式。
-
ClassName不是静态成员。你需要一个类类型的对象来调用成员。 -
一个minimal reproducible example 最好只产生您感到困惑的错误,包括预期的输出。上面的代码很混乱,很难说你在做什么。如果您的问题与模板有关,那么显示有效的等效非模板代码是一个不错的计划。