【问题标题】:How to override a virtual method with a different return type? [duplicate]如何覆盖具有不同返回类型的虚拟方法? [复制]
【发布时间】:2020-05-05 05:29:07
【问题描述】:
class Distribution
{
    public:
       virtual type GenerateRandomNumber() = 0;
};

在 Distribution 类中,有一个函数,派生类必须重写它。 其中一个派生类返回double,另一个返回unsigned int

class Gamma : public Distribution
{
   public:
      double GenerateRandomNumber() override;
};


class Poisson : public Distribution
{
   public:
      unsigned int GenerateRandomNumber() override;
};

我尝试将auto 作为基类中GenerateRandomNumber() 的返回类型,但不能同时使用自动和虚拟。 Base 类中的返回类型应该是什么?

【问题讨论】:

  • 然后将 Temple 作为返回类型
  • 不能那样做。函数签名必须匹配。如果您对它们进行模板化,则需要对基类进行模板化,并且通常情况不会更好,因为基类型不匹配。如果您的编译器是最新的,您可以返回 std::variant。就个人而言,我认为你可能会进入一个糟糕的地方。见Liskov Substitution Principle

标签: c++ c++11 c++14


【解决方案1】:

您不能有冲突的返回类型。如果你把你的基类 a 变成类模板,你会得到你需要的东西,但是派生类不会共享一个公共的基类。

例子:

template<typename type>
class Distribution {
public:
    virtual type GenerateRandomNumber() = 0;
};

class Gamma : public Distribution<double> {
public:
    double GenerateRandomNumber() override;
};


class Poisson : public Distribution<unsigned> {
public:
    unsigned int GenerateRandomNumber() override;
};

【讨论】:

    【解决方案2】:

    我认为您已经根据以下说明确定了最适合您的解决方案的方法,

    1. 你打算使用基指针来访问派生方法吗?
    2. Gamma 的实现返回双精度或整数类型。
    3. 您是否担心 gamma 会导致数据丢失。 (我在想为什么 gamma 是双精度的)。

    如果您想使用基指针并且无法承受 gamma 造成的数据丢失,您应该使用双精度,因为 double 到 long int 会导致数据丢失。 此外,建议不要对虚函数使用不同的返回类型,因为这可能会导致您的应用程序行为不端。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多