抽象基类有什么用?

时间:2014-12-22 14:32:10

标签: c++ inheritance

我知道抽象基类是那些具有纯虚函数的基类,并且不能创建抽象基类的对象。

那么,我们为什么要创建一个无法定义其对象的类?

5 个答案:

答案 0 :(得分:2)

我们希望它们提供接口描述,并强制派生类来实现这些接口。

 struct IRender;
 struct IShape {
      virtual void Draw(IRender& render) = 0;
      virtual ~IShape() {}
 };

 struct IRender {
      virtual void RenderShape(IShape& shape) = 0;
      virtual ~IRender() {}
 };

此时我们不想知道具体的实现。

答案 1 :(得分:2)

它是开发人员之间使用的一种合同,用于说"这是我们想要实现的功能类型",如果他们想要设计的类是,那么将实现留给开发人员继承基类。

简单示例:

#include <iostream>
using namespace std;
class Animal
{
    public:
        Animal() {}
        virtual void sound() = 0;
};

/* Dog class is derived from base class Animal */
class Dog : public Animal   
{
    public:
        Dog() {}
        void sound() 
        {
            cout << "woof!" << endl;
        }
};

此处DogAnimal,必须实现自己的声音。基类Animal的声音()函数意味着动物发出声音,并且任何继承自Animal的类都应该实现声音函数。从这里,您可以创建一个Cat类,从其声音类输出一个喵声,以及一个输出咆哮的Bear类等。

答案 2 :(得分:1)

除了作为接口的纯虚拟类之外,您还可以拥有一个包含纯虚函数和函数与定义的组合的类。这对于需要从子类定义的行为但不能实现它的多态基类很有用。

答案 3 :(得分:1)

采用基本继承示例:

class Animal { virtual void Eat() = 0; };// pure virtual base class
class Dog : Animal { ... };// tangible, real class

实施狗::吃是直截了当的。但是你将如何实现&#34; Animal :: Eat&#34;?没有通用的实施&#34; Eat&#34 ;;你需要一种特定类型的动物才能知道如何实施这样的行动。

答案 4 :(得分:1)

抽象类没有任何对象,但它可以有一个指针,可以保存派生类对象的地址。使用它我们可以对派生类执行操作

class Base {    
    public:
      virtual void method1();
}

class Derived:public Base {
// 1. List item

  void method1() {
     cout<<"in derived 1"<<endl;
  }
}

int main() {
    Base *ptr;
    Derived d;

    ptr=&d;
    ptr->method1();

}