【发布时间】:2014-12-22 14:32:09
【问题描述】:
我知道抽象基类是那些具有纯虚函数并且无法创建抽象基类的对象的类。
那么,我们为什么要创建一个不能定义其对象的类呢?
【问题讨论】:
-
我看不出这个问题有什么不好的,它应该值得这么多反对?它是基本的,但不是太宽泛,或者根本不清楚。
标签: c++ inheritance
我知道抽象基类是那些具有纯虚函数并且无法创建抽象基类的对象的类。
那么,我们为什么要创建一个不能定义其对象的类呢?
【问题讨论】:
标签: c++ inheritance
这是开发人员之间用来表示“这是我们想要实现的功能类型”的某种约定,如果他们想要设计的类要继承基类,则将实现留给开发人员。
简单示例:
#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 类输出咆哮等。
【讨论】:
我们希望它们提供接口描述,并强制派生类实现这些接口。
struct IRender;
struct IShape {
virtual void Draw(IRender& render) = 0;
virtual ~IShape() {}
};
struct IRender {
virtual void RenderShape(IShape& shape) = 0;
virtual ~IRender() {}
};
此时我们不想知道具体的实现。
【讨论】:
除了用作接口的纯虚类之外,您还可以拥有一个由纯虚函数和带定义的函数组合而成的类。这对于需要从子类定义行为但无法实现的多态基类很有用。
【讨论】:
举一个基本的继承例子:
class Animal { virtual void Eat() = 0; };// pure virtual base class
class Dog : Animal { ... };// tangible, real class
实现 Dog::Eat 很简单。但是你将如何实现“Animal::Eat”? “吃”没有通用的实现;您需要特定类型的动物才能知道如何执行此类操作。
【讨论】:
抽象类没有任何对象,但它可以有一个指针,可以保存派生类对象的地址。使用它我们可以对派生类执行操作
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();
}
【讨论】: