何时使用抽象类是有意义的

时间:2017-03-05 01:53:10

标签: c++ oop abstract-class

我正在从c转换到c ++,当然,OOP比预期的要困难得多。困难在于不了解类和继承的核心机制,而是如何使用它。我读过关于设计模式的书,但他们只展示了这些技术,并描绘了为什么应该使用这些技术的模糊图片。我真的很难找到抽象类的用途。以下面的代码为例。

class baseClass {
public:
    virtual void func1() = 0;
    virtual void func2() = 0;
};
class inhClass1 : baseClass {
public:
    void func1();
    void func2();
};
class inhClass2 : baseClass{
public:
    void func1();
    void func2();
};
int main() {}

我经常在设计书中看到这样设置的抽象类。我知道通过这种配置,继承的类可以访问基类的公共成员。我知道虚函数是继承类的占位符。问题是我仍然不明白这是如何有用的。我试图将它与重载函数进行比较,我只是没有看到实际用途。

我真正想要的是让某个人能够用最简单的例子来说明抽象类实际上有用的原因以及最佳解决方案。别误会我的意思。我不是说没有一个好的答案。我只是不明白如何正确使用它们。

3 个答案:

答案 0 :(得分:4)

抽象类和接口都允许您定义子类应实现的方法签名:名称,参数,异常和返回类型。

抽象类可以提供默认实现,如果存在合理的实现。这意味着子类不必实现这样的方法;如果他们选择,他们可以使用默认实现。

接口没有这样的选项。实现接口的类是 required 来实现其所有方法。

在Java中,区别很明显,因为该语言包含关键字interface

C ++接口是具有所有virtual方法和纯虚拟析构函数的类。

当您想要将接口与实现分离时,将使用抽象类和接口。当您知道有多个实现可供选择时,或者当您编写允许客户端插入自己的实现的框架时,它们非常有用。该界面提供了客户期望遵守的合同。

答案 1 :(得分:3)

抽象类的一个用途是能够在对代码进行最小更改的情况下在不同的具体实现之间轻松切换。您可以通过向基类类型声明引用变量来完成此操作。派生类的唯一提及是在创建期间。所有其他代码都使用基类引用。

答案 2 :(得分:0)

抽象类用于提供要隐藏细节的某些概念的抽象表示。

例如,假设我想实现文件系统接口: -

在抽象层面我能想到什么?

class FileSystemInterface
{
    virtual void openFile();
    virtual void closeFile();
    virtual void readFile();
    virtual void writeFile();
};

此时此刻,我并没有考虑具体的内容,比如在Windows或Linux中如何处理它们,而是专注于一些抽象的想法。