gpt4 book ai didi

c++ 内部调用虚函数的函数

转载 作者:行者123 更新时间:2023-11-28 03:03:07 25 4
gpt4 key购买 nike

一直在努力加深对虚函数的理解。为了争论,假设我有一个基类:

class Shape
{
protected:
string _name;
int _num;
public:
Shape();
virtual double CalcShape();
};

还有 2 个较低的类:

class Rectangle : public Shape
{
private:
double _height;
double _width;
public:
Rectangle();
Rectangle(double, double);
double GetHeight();
double GetWidth();
double CalcShape(double, double); //calculates rectangle
};

class Triangle : public Shape
{
private:
double _side1;
double _side2;
double _side3;
public:
Triangle();
Triangle(double, double, double);
double GetSide();
double CalcShape(double, double, double); //calculates triangle
};

假设我还有一个名为 ShowCalc(Shape&); 的函数。此函数调用内部的 CalcShape() 函数。

void ShowCalc(Shape& sh)
{
return sh.CalcShape();
}

现在有办法让函数 CalcShape() 接受三角形的 GetSide() 函数和矩形的 GetHeight()< 的输入GetWidth() 看看 Triangle 如何接受 3 个参数而 Rectangle 如何接受 2 个参数?

最佳答案

我在这里看到多个设计错误:

  • 不能对引用使用虚拟方法:引用指向指定类型的真实对象。动态分配不起作用,因为 Shape& 是一个 Shape 并且即使您在初始化值时为其分配了一个子类,派生的所有内容都会因为 object slicing 而被丢弃。
  • virtual 函数用于当子类中的重写方法具有特定实现时使用。重写的方法与原始方法具有相同的签名。在您的情况下,您在 Shape 中有 CalcShape(void),在 Rectangle 中有 CalcShape(double, double)。这不是覆盖,这是重载,这是完全不同的事情。您可以在 C++11 中使用 override 关键字来确保您正确地覆盖了虚拟方法。
  • virtual 如果在基类上的实现没有意义(因为您无法计算未知类型形状的面积),则方法应该是纯方法。如果您有这个纯 (= 0),编译器会警告您没有子类实际上覆盖它这一事实。

要获得你想要的东西,你需要在实现中使用成员变量,而不是通过调用传递它们,例如:

class Shape {
virtual double calcArea() = 0;
}

class Rectangle : public Shape {
private:
double width, height;
public:
virtual double calcArea() override { return width*height; }
}

Shape *shape = new Rectangle(10,20);
double area = shape->calcArea();

关于c++ 内部调用虚函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com