C ++接口问题与创建它的实例有关

时间:2014-03-23 18:55:03

标签: c++ inheritance interface

所以我在我的C ++类中有一个赋值,要求我创建一个名为Project的抽象基类,以及一个名为Task的接口。现在他给了我们main的驱动程序代码,并且在其中它要求我们创建一个接口“Task”的实例,并且我不断收到错误,说“你不能创建一个抽象基类的实例”这里是我的“任务“接口头文件和主...我希望它足够了。

#pragma once
#ifndef TASK_h
#define TASK_h
class Task
{
public:
    Task();
    virtual ~Task();
    virtual void addPrereq(Task *pt) = 0;
    virtual bool ready() = 0;
    virtual bool done() = 0;
    virtual void doIt() =0;
};
#endif

主要:

#include "stdafx.h"
#include "CompositeProject.h"
#include "MinorProject.h"
#include "SimpleProject.h"
#include "Task.h"

int _tmain(int argc, _TCHAR* argv[])
{
// Create tasks

Task* tasks[7];
for (int i = 0; i != 7; ++i)
    tasks[i] = new Task();//This is where my error is coming from
// Set prerequisites
tasks[1]->addPrereq(tasks[0]);
tasks[2]->addPrereq(tasks[1]);
tasks[3]->addPrereq(tasks[2]);
tasks[3]->addPrereq(tasks[4]);
tasks[4]->addPrereq(tasks[0]);
tasks[5]->addPrereq(tasks[4]);
tasks[6]->addPrereq(tasks[3]);
tasks[6]->addPrereq(tasks[5]);

return 0;
}

现在据我所知,抽象基类和接口之间的区别在于抽象基类通常具有受保护的构造函数,并且至少有一个纯虚方法。现在,一个接口的所有方法都是纯虚拟的,基本上都有一个模板。现在我不明白我的老师是如何或为什么要求我们创建接口任务的实例。他明确地在作业的其他地方说过,期望的文件是“Task.h和Task.cpp”。我觉得这里有一个关键因素。谢谢!

1 个答案:

答案 0 :(得分:1)

默认情况下,您无法创建抽象基类的对象,因为ABC就像一个蓝图,您可以在其上创建实际的实现。举个例子,你可以定义一个Shape抽象基类,它有一个名为virtual void form()=0;的方法,用于重新定义某种几何形状的形式,在该类上你可以定义另一个名为Cube的类。另一个名为Circle,但这些类中的每一个都继承了void form();函数,您需要为CubeCircle类重新定义...所以回到你的问题抽象类应该被称为Project(正如你所说),你的代码应该看起来像这样

#ifndef TASK_H
#define TASK_H
class Project { //project is the abstract base class 
    public:
        Project();
        virtual ~Project();
        virtual void addPrereq(Project *pt) = 0;
        virtual bool ready() = 0;
        virtual bool done() = 0;
        virtual void doIt() =0;
};
class Task:public Project { 
        Task();
        virtual ~Task();
        virtual void addPrereq(Task *pt);
        virtual bool ready();
        virtual bool done();
    virtual void doIt();
}
#endif // PROJECT_H

总结:

  1. 当类声明包含纯虚函数时,您无法创建该类的对象。
  2. ABC中任何非虚拟的方法都是继承的,就像它被定义一样,如果void move();类中有Shape函数,那么你可以在所有继承的类中使用该函数,这样你就不会# 39; t需要声明所有虚函数
  3. ABC描述了一个使用至少一个纯虚函数的接口,并且从ABC派生的clases使用常规虚函数来根据特定派生类的属性实现接口