abstract classes 需要什么?为什么要通过其基础 class 访问派生的 classes 方法?在 C++ 中

What is the need of abstract classes ? Why access a derived classes method through its base class ? in C++

我是 C++ 面向对象编程的初学者。我正在研究 "Abstract Classes",示例代码是:

#include <iostream>
using namespace std;

class Enemy {
    public:
        virtual void attack() = 0;
};

class Ninja: public Enemy {
    public:
        void attack() {
            cout << "Ninja!"<<endl;
        }
};

class Monster: public Enemy {
    public:
        void attack() {
            cout << "Monster!"<<endl;
        }
};


int main()
{
    Ninja n;
    Monster m;
    Enemy *e1 = &n;
    Enemy *e2 = &m;

    e1->attack();
    e2->attack();

    return 0;
}

我想理解的是为什么我不能直接使用派生的classes 的对象来直接访问带有“.”的派生的class 成员。运算符(有效,但不建议为什么?)。

像这样:

int main()
{
    Ninja n;
    Monster m;
    Enemy *e1 = &n;
    Enemy *e2 = &m;

    //e1->attack();
    //e2->attack();
    n.attack();
    m.attack();

    return 0;
}

我知道在某些情况下我们需要通过基class来访问派生classes的成员(我认为这是所有程序员通常使用的),但我不知道这种情况在现实世界中的实现(为什么我们不能直接去,为什么要通过基指针class?)。

如果有人能澄清我的疑问,我会很高兴。

一组敌人(std::vector<Enemy*>)可以有忍者和怪物。忍者合集只能有忍者,怪兽合集只能有怪兽

抽象基础class为子classes提供了一个通用接口来实现,但是抽象基础class的实例没有实际意义(否则你不会将基础 class 抽象化)。

其余部分已涵盖购买其他答案,但 "Why a pointer?" 已被忽略。

每个子classes 都有不同的内容和可能不同的大小。如果没有引用,程序就必须知道确切的大小才能分配存储空间。强制所有子 class 的大小相同是行不通的,因为这违背了 C++ 的意识形态,即只为你使用的东西付费,并且需要修改以前编译的代码(一个新模块添加了一个new subclass,所有现有模块也必须更改)。此外,基 class 没有合理的方法来了解其子 class 的详细信息(以及不应该这样做的许多原因),这包括了解大小。

有了参考,没有人关心大小或实现细节。如果对象是多态的(这是 probably a "v-table",但 C++ 不关心使用什么 voodoo,只要结果满足标准)。