什么是使类抽象的好处

Ras*_*yak 5 c++ abstract-class

我们举一个例子,

class base{
public:
virtual void abstract() = 0;
};

class derived:public base{
public:
void abstract(){cout << "Abstract\n";}
};

int main{
derived d;
d.abstract();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

它可以用其他方式编写,

class base{
    public:
    void abstract(){cout << "Abstract\n";}
    };

    int main{
    base b;
    b.abstract();
    return 0;
    }
Run Code Online (Sandbox Code Playgroud)

它也提供相同的结果,事实上我不需要派生类.我确实阅读了许多关于抽象类的文章,it says we can not instantiate base classpure virtual function强迫用户使用define the function.但是如果我们在两种情况下都会看到上面的代码,那么我得到相同的结果(or output).那么我的问题是abstract课程如何帮助我们?

Ste*_*sop 6

正如您已经注意到的那样,在您的示例代码中,没有必要具有单独的基类和派生类.

通常,具有虚函数的类的目的是动态多态,但您的代码尚未使用它.

假设你有一些代码使用了一个base*不知道它实际指向哪个(几个)派生类的代码.假设它们各自具有不同的实现abstract().假设您要强制编写派生类的任何人base实现自己的版本abstract().然后有一个理由来创建abstract()一个纯虚函数,因此base成为一个抽象类的原因:

#include <iostream>
#include <cstdlib>
#include <ctime>

struct Base {
    virtual void abstract() = 0;
    virtual ~Base() {};
};

struct Derived1 : Base {
    void abstract() { std::cout << "Derived1\n"; }
};

struct Derived2 : Base {
    void abstract() { std::cout << "Derived2\n"; }
};

Base *random_object() {
    if (std::rand() < RAND_MAX/2) {
        return new Derived1();
    } else {
        return new Derived2();
    }
}

int main() {
    std::srand(std::time(0));
    Base *b = random_object();
    b->abstract();
    delete b;
}
Run Code Online (Sandbox Code Playgroud)

代码main只关心Base,它不需要知道任何有关派生类的知识,除了可能有一些.只有代码random_object知道派生类.同时Base不需要知道如何abstract()实现,只有派生类做(并且每个人只关心它自己的实现).对于不需要了解事物的代码来说这很好 - 这意味着可以在不触及不关心的代码的情况下更改这些内容.

使用非抽象类作为公共基类也存在一些高级设计问题.例如,一旦你的一些函数被覆盖,很容易不经意地编写代码就会无法正常工作,并且很容易意外地用一个具体的基类对对象进行切片.因此,有一种哲学认为你应该随时都知道你是在写一个具体的课程还是一个基础课程,而不是试图同时做两件事.当你遵循这个哲学时,所有基类都是抽象的,所以你创建一个类抽象来表明它是为了派生而设计的.