【问题标题】:What is the use of an abstract base class? [duplicate]抽象基类有什么用? [复制]
【发布时间】:2014-12-22 14:32:09
【问题描述】:

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

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

【问题讨论】:

  • 我看不出这个问题有什么不好的,它应该值得这么多反对?它是基本的,但不是太宽泛,或者根本不清楚。

标签: c++ inheritance


【解决方案1】:

这是开发人员之间用来表示“这是我们想要实现的功能类型”的某种约定,如果他们想要设计的类要继承基类,则将实现留给开发人员。

简单示例:

#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,并且必须实现它自己的声音。基类Animal 的sound() 函数意味着Animals 会发出声音,并且任何从Animal 继承的类都应该实现一个声音函数。由此,您可以创建一个 Cat 类从其声音类中输出喵喵声,以及一个 Bear 类输出咆哮等。

【讨论】:

  • 那不是抽象基类;这只是(ab)使用继承将函数绑定到现有类的一种奇怪方式。
  • 我把它改成了更容易理解的东西。
  • 仍然不是抽象的,甚至也不是多态的。该函数在基类中应该是纯虚函数,以使其抽象。
  • 再次修复。这是一个漫长的周末.....
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    除了用作接口的纯虚类之外,您还可以拥有一个由纯虚函数和带定义的函数组合而成的类。这对于需要从子类定义行为但无法实现的多态基类很有用。

    【讨论】:

      【解决方案4】:

      举一个基本的继承例子:

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

      实现 Dog::Eat 很简单。但是你将如何实现“Animal::Eat”? “吃”没有通用的实现;您需要特定类型的动物才能知道如何执行此类操作。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 你可以创建一个 Base 的实例,但是一旦你定义了 method1 的主体。根据定义,您不能实例化抽象基类。
        猜你喜欢
        • 2014-01-15
        • 2012-11-29
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 2010-11-13
        • 2013-02-17
        相关资源
        最近更新 更多