当前位置: 首页 > 知识库问答 >
问题:

工厂设计模式中的纯虚函数错误

唐向荣
2023-03-14

正在学习期末考试,并决定构建一个利用纯虚拟函数和多态性的程序。我陷入了一个非常奇怪的错误,也许我错过了什么。

这是形状抽象类

#ifndef Shape_hpp
#define Shape_hpp

#include <stdio.h>
#include <string.h>

class Shape{
    const char* name;
public:
    Shape(const char* abc);
    virtual double getPerimeter()=0;
    virtual double getArea()=0;
};

#endif /* Shape_hpp */

形状。cpp实施文件

#include "Shape.hpp"

Shape::Shape(const char *shape){
    name = shape;
}

Circle头文件

#ifndef Circle_hpp
#define Circle_hpp

#include "Shape.hpp"
#include <stdio.h>

class Circle:public Shape{
    double m_radius;
public:
    Circle(double rad);
    double getRadius();            
};

#endif /* Circle_hpp */

循环. cpp实现文件

#include "Circle.hpp"
#include "Shape.hpp"

Circle::Circle(double rad):Shape("Circle"){
    m_radius = rad;
}

double Circle::getRadius(){
    return m_radius;
}

double Circle::getPerimeter(){
    return (2 * 3.14 * m_radius);
}

double getArea(){
   return 0;
}

我在抽象的“shape”类中声明了两个纯虚函数,并且正在访问circle头文件中shape类的public,如果我在circle类中声明纯虚函数,它将使其抽象。。。错误表示“GetPermiture的越界定义与Circle中的任何声明都不匹配”

我是错过了什么,还是我想错了。。

我们将不胜感激。谢谢

共有3个答案

孔阳炎
2023-03-14

应该这样做。

class Shape{
    const char* name;
public:
    Shape(const char* abc);
    virtual ~Shape() {} // you should have virtual destructor here
    virtual double getPerimeter()=0;
    virtual double getArea()=0;
};
class Circle:public Shape{
    double m_radius;
public:
    Circle(double rad);
    double getRadius();
    virtual double getPerimeter(); // we need to re-declare it here
    virtual double getArea(); // we need to re-declare it here
};
酆勇
2023-03-14

您正在中定义圆::getPermiture()。cpp文件,但Circle类声明中没有成员函数getPermiture()。所有纯虚函数都需要在派生类中重写,以使类变得具体。所以是的,virtualdouble-getpermiture() 和重写”。

此外,声明简单的getterconst也是一种很好的做法。

龙珂
2023-03-14

您需要声明您定义的所有成员函数。因此,在类圆中,您需要添加:

virtual double getPerimeter();

或在C 11中更好:

double getPerimeter() override;
 类似资料:
  • 介绍 与创建型模式类似,工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。 这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,你会经常在程序里看到工厂方法,用于让子类类定义需要创建的对象类型

  • 简单工厂(Simple Factory) Intent 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。 Class Diagram 简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。 这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所

  • 4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 cr

  • 工厂方法(Factory Method) Intent 定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。 Class Diagram 在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。 下图中,Factory 有一个 doSomething() 方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod() 方法创建。

  • 我想知道在Spring框架中使用依赖注入的工厂模式的当前最佳实践是什么。我想知道工厂模式在使用Spring依赖注入的情况下是否仍然适用。我做了一些搜索,看到了一些过去的讨论(依赖注入vs工厂模式),但似乎有不同的观点。 我在一些现实生活中的项目中看到使用Map来保存所有的bean,并依靠自动装配来创建这些bean。当需要bean时,它使用密钥通过map获取它。 但是我看到这两种方法有些不同。 使用

  • 本文向大家介绍Ruby中使用设计模式中的简单工厂模式和工厂方法模式,包括了Ruby中使用设计模式中的简单工厂模式和工厂方法模式的使用技巧和注意事项,需要的朋友参考一下 之前有看过《ruby设计模式》,不过渐渐的都忘记了。现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下。 简单工厂模式: 这样写的好处是降低耦合。 比如增加一个开根号运算的时候,只需要在工厂类中添加一个分支