小学生学C++编程语法知识(为什么抽象基类不能创建对象?)

发布时间:2026/8/11 13:21:51
小学生学C++编程语法知识(为什么抽象基类不能创建对象?) C面向对象为什么抽象基类不能创建对象同学们前面我们学习了什么是类什么是继承什么是虚函数什么是多态今天我们学习一个很重要的概念为什么抽象基类不能创建对象这个问题在 GESP、CSP-J/S 中非常常见。一、先回忆什么是基类假设我们要设计一个动物系统。有狗猫鸟它们都是动物。我们可以写class Animal { public: void eat() { cout 吃东西 endl; } };然后class Dog : public Animal { }; class Cat : public Animal { };这里Animal | -------------- | | Dog CatAnimal 是父类基类Dog、Cat 是子类派生类二、普通基类可以创建对象例如Animal a;完全没有问题。因为 Animal 自己是完整的。它有吃东西()这个功能。所以Animal对象 { eat() }可以存在。但是问题来了如果 Animal 只是一个概念呢比如动物会叫。但是狗怎么叫汪汪猫怎么叫喵喵鸟怎么叫叽叽那么Animal 的叫声是什么不知道。三、什么是抽象基类我们看class Animal { public: virtual void speak() 0; };这里virtual void speak() 0;叫纯虚函数pure virtual function意思“我只规定规则但是不写具体内容。”例如动物必须会叫但是怎么叫交给孩子。然后狗class Dog : public Animal { public: void speak() { cout汪汪endl; } };猫class Cat : public Animal { public: void speak() { cout喵喵endl; } };结构Animal (会叫但是不知道怎么叫) | ---------------- | | Dog Cat (汪汪) (喵喵)四、为什么 Animal 不能创建对象如果写Animal a;C 会报错。为什么因为Animal 里面有virtual void speak() 0;它只是告诉大家必须有叫的方法但是它自己没有叫的方法所以Animal对象 { ? }不完整。打个比方动物学校校长说所有学生必须会唱歌。但是校长没有规定唱什么歌。现在来了一个学生Animal学生老师问请唱歌。学生我不知道唱什么。所以这个学生不能报名。五、抽象类为什么存在有人问既然不能创建对象那为什么还要写它这是重点抽象类的作用为子类制定统一规则。例如游戏里面角色有战士法师弓箭手设计class Role { public: virtual void attack()0; };意思所有角色必须攻击。战士class Warrior:public Role { public: void attack() { cout挥剑攻击; } };法师class Mage:public Role { public: void attack() { cout释放魔法; } };以后游戏写Role *p;可以pnew Warrior(); p-attack();也可以pnew Mage(); p-attack();这就是多态六、抽象类和普通类的区别普通类抽象类有没有纯虚函数没有有能否创建对象可以不可以作用描述具体东西规定规则是否可以继承可以主要给子类继承七、判断一个类是不是抽象类非常简单看有没有0例如不是抽象类class A { public: virtual void fun() { } };可以A a;是抽象类class A { public: virtual void fun()0; };不能A a;八、抽象类可以有普通函数吗当然可以。例如class Animal { public: virtual void speak()0; void eat() { cout吃东西; } };这里Animal | |-- speak() | (没有实现) | |-- eat() (已经实现)子类继承class Dog:public Animal { public: void speak() { cout汪汪; } };然后Dog d; d.eat(); d.speak();输出吃东西 汪汪九、抽象类可以有构造函数吗可以。例如class Animal { public: Animal() { cout动物出生; } virtual void speak()0; };虽然Animal a;不允许。但是创建Dog d;时执行顺序Animal构造函数 ↓ Dog构造函数因为先出生父亲再出生孩子。十、抽象类最重要的应用接口思想很多时候我们不是为了创建对象。而是为了规定所有子类必须完成什么功能。例如支付系统Payment | -------------------- | | 支付宝 微信抽象类class Payment { public: virtual void pay()0; };支付宝class AliPay:public Payment { void pay() { cout支付宝支付; } };微信class WeChatPay:public Payment { void pay() { cout微信支付; } };以后Payment *p;不用管具体是谁。这就是统一接口 多态十、一句话总结考试重点抽象基类因为包含至少一个纯虚函数表示它是不完整的“规则模板”没有具体实现所以不能创建对象它的作用是让派生类继承并实现这些纯虚函数从而实现多态。记忆口诀有纯虚函数 ↓ 抽象类 ↓ 不能创建对象 ↓ 只能被继承 ↓ 实现多态对于 GESP/CSP-J 同学们可以把它和前面学过的知识串起来继承 ↓ 虚函数 ↓ 纯虚函数 ↓ 抽象基类 ↓ 多态这条链是 C 面向对象最核心的一条线。

相关新闻