【问题标题】:How do I implement a generic polymorphism to print the length? That's what they asked me to do如何实现通用多态性来打印长度?这就是他们要求我做的
【发布时间】:2021-09-27 09:33:28
【问题描述】:

他们要求我实现一个通用的多态性来打印长度,我不知道该怎么做。我认为对于多态性,它必须不止一个类,但他们只要求 onw 类

#include <iostream>

using namespace std;

class Line {
private:
    double x1, x2;
    double y1, y2;
    double z1, z2;
    double length;
public:
    Line(double a, double b, double c, double d, double e, double f):x1(a), x2(d), y1(b), y2(e), z1(c), z2(f){
        length = sqrt(pow(x2-x1, 2) + pow(y2-y1, 2) + pow(z2-z1, 2));
    }

    ~Line(){cout << endl << "destroying line";}
};

int main() {
    Line line1(2,3,4,9,7,12);
    Line line2(12,16,7,25,32,16);
    Line line3(5,2,13,24,18,15);
}

【问题讨论】:

  • 我猜要求是实现一个返回长度的虚拟方法。 virtual 将允许子类重载它(又名多态性)。您正在设置多态性功能。
  • 不只是你,我也很困惑。你能发布你的确切要求吗?
  • 仅供参考,x * x 通常比pow(x, 2) 更有效。另外pow函数返回的是floading point,所以来回转换时可能会有些不准确。
  • 另外,您需要将析构函数声明为 virtual 以帮助支持多态性。
  • 我从未听说过“通用多态性”,但显然它与“参数多态性”相同。参数多态性的一个典型示例(排序)是 STL 算法(按类型参数化,适用于任何类型的迭代器范围)。在这种情况下,您如何“实施”这样的概念并不完全清楚。此代码中没有任何类型参数。也许他们希望您将Line 转换为模板,并将double 转换为其类型参数。或者他们可能想要print_length 函数模板的类型参数。

标签: c++ function class constructor polymorphism


【解决方案1】:

要回答所提出的问题,首先您需要公开length,因为它目前已被封装 - 您可以在您的类的public: 部分添加一个函数:

auto get_length() const { return length; }

然后您可以使用泛型多态性来打印长度(您的“实现泛型多态性”,字面意思):

template <typename T>
void print_length(const T& t) {
    std::cout << t.get_length() << '\n';
}

然后你可以通过在main()底部添加一些调用来证明它有效:

print_length(line1);
print_length(line2);
print_length(line3);

话虽如此,他们也有可能并不真正想要“通用”多态性——不知道“通用”往往是指使用模板的多态性——而只是期待以下内容:

struct with_length {
    virtual ~with_length() { }
    virtual double get_length() const = 0;
};
class Line : with_length {
    ...
    double get_length() const { return length; }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2021-08-04
    • 2013-07-10
    • 1970-01-01
    • 2013-11-30
    • 2010-10-30
    相关资源
    最近更新 更多