调用内部虚拟函数的c++函数
c++ Functions that call virtual functions inside
一直在努力更好地理解虚拟函数。为了便于论证,假设我有一个基类:
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()
的输入,就像三角形取3个参数,矩形取2个参数一样?
我在这里看到多个设计错误:
- 不能将
virtual
方法与引用一起使用:引用指向指定类型的真实对象。动态调度不起作用,因为Shape&
是Shape
,即使在初始化值时为其分配子类,由于对象切片,派生的所有内容都会被丢弃 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();
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗