2014-12-22 6 views
-3

Я знаю, что абстрактные базовые классы - это те, которые имеют чистую виртуальную функцию, и объекты абстрактного базового класса не могут быть созданы.Что такое абстрактный базовый класс?

Итак, почему мы должны создавать класс, который не может определить его объект?

+3

Я не могу видеть, что это такое плохо с этим вопросом, что он должен заслужить так много downvotes? Это базовая, но не слишком широкая или неясная вообще. –

ответ

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; 
     } 
}; 

Здесь Dog является Animal, и должен реализовывать свой собственный звук. Функция sound() базового класса Animal подразумевает, что животные создают звуки и что любой класс, который наследует от Animal, должен реализовывать звуковую функцию. Из этого вы можете сделать класс Cat, который выводит мяу из его звукового класса, а также класс Bear, который выводит рев и т. Д.

+2

Это не абстрактный базовый класс; это просто странный способ (ab) использовать наследование для функций болтов на существующий класс. –

+0

Площадь «представляет собой« Прямоугольник ... хмммм. http://en.wikipedia.org/wiki/Liskov_substitution_principle – djgandy

+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

В дополнение к чистому виртуальному классу, который служит в качестве интерфейса, вы можете также имеют класс с комбинацией чистых виртуальных функций и функций с определениями. Это полезно для полиморфного базового класса, который требует определенного поведения из подклассов, но не может его реализовать.

1

Возьмем простой пример наследования:

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

Реализация собак :: Едят прямо вперед. Но как бы вы реализовали «Animal :: Eat»? Существует нет общей реализации «Ешьте»; вам нужен определенный тип животных, чтобы знать, как реализовать такое действие.

1

абстрактная класс не имеет какой-либо объект, но он может иметь указатель, который может содержать адрес производного класса object.using этого можно выполнять операции на производные классов

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(); 

} 
+0

Вы можете создать экземпляр Base, как только вы определите тело метода1. По определению вы не можете создавать абстрактные базовые классы. – djgandy

Смежные вопросы