【问题标题】:Define default constructor for abstract base class为抽象基类定义默认构造函数
【发布时间】:2011-08-28 02:33:28
【问题描述】:
class ClassA {
public:
    ClassA() {} // when this function must be provided
    virtual ~ClassA() = 0 {}
};

class ClassB : public ClassA
{
    // ...        
};

我想知道什么时候必须提供抽象基类的默认构造函数。

【问题讨论】:

  • 我不认为作为一个基础抽象类与它有任何关系。所以我猜答案是“在通常需要的时候”,例如当你需要能够构造带参数和不带参数的类时。
  • 另外,你不能在纯虚函数上拥有一个主体 (= 0 { })。
  • @Seth Carnegie:Actually, you can have a body on a pure virtual function。 (名为“1. Pure Virtual Destructor”的部分在这里特别重要。)
  • @In 哇,什么大火。 = 0 那么到底有什么不同呢?我认为这意味着子类必须实现它,因为基类没有。
  • @Seth Carnegie:类仍然必须在实例化之前覆盖所有纯虚函数,就像往常一样。但是您仍然可以为要调用的子类提供定义。阅读链接的 GotW #31 文章,了解为什么有人会这样做。

标签: c++


【解决方案1】:

提供默认构造函数与类的抽象与否之间没有联系。

如果需要初始化,请提供默认构造函数定义。

如果您想禁止默认构造,请提供(可能未实现的)非公开声明。

干杯,

【讨论】:

    【解决方案2】:

    如果它真的是一个没有数据成员的抽象基类,那么编译器生成的构造函数在任何情况下都完全足够了。

    派生类将始终调用默认的基类构造函数,除非它们的构造函数在初始化列表中指定了不同的构造函数。

    【讨论】:

    • 你不会说对于没有数据成员的非抽象类也是如此(无论如何程度相同)?
    猜你喜欢
    • 2018-09-16
    • 2020-04-23
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多