如何更改继承类成员的返回类型

How to change the return type of an inherited class member

本文关键字:返回类型 成员 何更改 继承      更新时间:2023-10-16

我最近刚刚学习了模板,我有点好奇。是否可以将继承函数的返回类型更改为模板类型?

例如:

class A{
public:
    int getSomething();
};
template<typename T>
class B : public A{
public:
    T getSomething();
};

您可以这样做,但B中的函数将隐藏A中的函数。当您使用someB.getSomething()时,将只看到B中的函数。无论返回类型是否匹配,这都是正确的。

如果您愿意,可以将A::getSomething纳入范围:

template<typename T>
class B : public A {
public:
    using A::getSomething;
    T getSomething();
};

然而,当A::getSomething具有不同的签名时,这种using声明更有用,而在这里,它们都具有相同的参数列表。

若要在此处覆盖getSomething,必须将其标记为virtual:

class A {
public:
    virtual int getSomething();
};

现在,尝试用int以外的东西实例化B无法编译。

仍然有一种情况,您可以更改返回类型,但仍然可以覆盖函数。这是一个协变返回类型,其中派生类返回的东西比基类返回的东西更派生:

class A{
public:
    virtual A* getSomething();
};
class B : public A{
public:
    B* getSomething() override; 
};