【问题标题】:What is the application of pure abstract classes ? C++ [duplicate]纯抽象类的应用是什么? C++ [重复]
【发布时间】:2019-04-11 23:11:04
【问题描述】:

我们都知道一个 Animal 类的基本示例,然后是 Cat 和 Dog 类。但我没有得到一件事,例如假设 Animal 是一个只有一个方法的纯抽象类:

    virtual void sayHello() = 0;

然后我们创建了 Cat 和 Dog 类,我们仍然需要覆盖它们类中的方法,所以它的基本目的是什么,因为现在我只看到附加代码。 我有一个 BankAccount 类的例子,我们只用方法制作了 2 个纯虚拟类:一个用于冻结帐户,第二个用于发出有关存款的消息。然后我们创建了 SavingsAccount 类,它继承了前面提到的所有类,但我仍然必须覆盖这些纯虚方法。即使我做了另一个,即外币 CurencyAccount 帐户,我仍然必须覆盖纯虚拟方法。那么制作这些纯虚类和方法的目的是什么?

【问题讨论】:

  • 为什么不谷歌“什么是多态性”?
  • @AndreyChernukha 有时人们不知道如何调用某个“事物”。我希望现在不需要答案。
  • 抽象类也可以称为interface类。如果您曾经使用过 Java,那么抽象类类似于 Java 接口。简而言之,它们可以被子类用来获得一个通用接口。
  • @Croolman 好的,我同意,但谷歌“什么是 c++ 抽象类”会有所帮助。这绝对不是一个 SO 问题
  • 只是关于术语:“纯抽象类”,如标题所示,混合了两个技术术语。成员函数可以是纯虚函数(其声明以= 0 结尾)。具有一个或多个纯虚函数的类是抽象类

标签: c++ class virtual


【解决方案1】:

一个目的是让您可以编写多态代码。

你现在可以编写一个不需要知道它是什么动物的函数, 每只动物的sayHello() 代码的实现可能非常不同,在Animal 的子类之间共享这些代码是没有意义的

void doSomething(Animal &animal)
{
    animal.sayHello();
}

如果每个动物都有相同的 sayHello() 实现,那么将方法设为纯虚拟就没有多大意义..

【讨论】:

  • 天哪,我明白了,你为整个动物做一个doSth(),然后我们可以通过它调用所有动物!谢谢
【解决方案2】:

它让您可以独立于其动态类型使用继承类的对象。

struct Base
{
    virtual void f() const = 0;
}
struct Derived1 : Base
{
    void f() const override { /* impl */ }
}
struct Derived2 : Base
{
    void f() const override { /* impl */ }
}

void g(Base const& b)
{
    b.f();
}

如您所见,g() 并不关心绑定到b 的对象实际上是Derived1 还是Derived2。尽管如此,它还是调用了它的成员函数f()。并且虚拟机制调用相应的f()函数。

有大量的实际应用程序、陷阱等。你真的应该得到一个good C++ book。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2020-03-05
    • 2016-01-25
    • 2015-08-14
    相关资源
    最近更新 更多