我知道抽象基类是那些具有纯虚函数的基类,并且不能创建抽象基类的对象。
那么,我们为什么要创建一个无法定义其对象的类?
答案 0 :(得分:2)
我们希望它们提供接口描述,并强制派生类来实现这些接口。
struct IRender;
struct IShape {
virtual void Draw(IRender& render) = 0;
virtual ~IShape() {}
};
struct IRender {
virtual void RenderShape(IShape& shape) = 0;
virtual ~IRender() {}
};
此时我们不想知道具体的实现。
答案 1 :(得分:2)
它是开发人员之间使用的一种合同,用于说"这是我们想要实现的功能类型",如果他们想要设计的类是,那么将实现留给开发人员继承基类。
简单示例:
#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
的声音()函数意味着动物发出声音,并且任何继承自Animal
的类都应该实现声音函数。从这里,您可以创建一个Cat
类,从其声音类输出一个喵声,以及一个输出咆哮的Bear
类等。
答案 2 :(得分:1)
除了作为接口的纯虚拟类之外,您还可以拥有一个包含纯虚函数和函数与定义的组合的类。这对于需要从子类定义的行为但不能实现它的多态基类很有用。
答案 3 :(得分:1)
采用基本继承示例:
class Animal { virtual void Eat() = 0; };// pure virtual base class
class Dog : Animal { ... };// tangible, real class
实施狗::吃是直截了当的。但是你将如何实现&#34; Animal :: Eat&#34;?没有通用的实施&#34; Eat&#34 ;;你需要一种特定类型的动物才能知道如何实施这样的行动。
答案 4 :(得分:1)
抽象类没有任何对象,但它可以有一个指针,可以保存派生类对象的地址。使用它我们可以对派生类执行操作
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();
}