class Base
{
public:
string Test() { return "hi"; }
};
class Derived : public Base
{
public:
int Test() { return 3; }
}
我希望来自Base的“hi”。怎样才能让string s = Derived().Test()
工作?不,Test
没有参数。
我尝试了using Base::Derived
,但似乎只返回类型不同的重载函数不会被继承/暴露。我无法从客户端代码中引用Base
,因为Base
将是模板生成的。客户端知道它想要的类型。我无法通过继承获得Test<string>()
。
答案 0 :(得分:1)
那是因为你没有超载,而是隐藏。
您需要转回基类。
Derived d;
d.Test(); //calls Derived::Test()
static_cast<Base>(d).Test(); //calls Base::Text()
您不能根据返回类型重载函数:
有关参与重载的函数的信息 resolution(13.3):它的参数类型列表(8.3.5),如果是 function是一个类成员,函数上的cv-qualifiers(如果有的话) 本身和声明成员函数的类。 [...]
答案 1 :(得分:1)
如果您使用的是C ++ 11,则可以执行以下操作:
class Base
{
public:
string Test() { return "hi"; }
};
class Derived : public Base
{
public:
template<typename T= decltype(Test())>
T Test() { return Base::Test(); }
};
答案 2 :(得分:1)
像这样:string s = Derived().Base::Test();
你的编译器不会通过基类型继续进行任务,但如果你告诉它在哪里看,它会找到合适的函数。