【问题标题】:Providing a Base Class Constructor提供基类构造函数
【发布时间】:2017-10-26 00:00:05
【问题描述】:

是否有必要始终为您的基类提供构造函数?例如,如果我有以下基类,然后是一些派生类。

class Animal
{
 public:

    //Is this constructor necessary?
    Animal(); 

    virtual ~Animal();
};

class Zebra: public Animal
{
 public:
    Zebra();
   ~Zebra();
};

class Elephant: public Animal
{
 public:
    Elephant();
   ~Elephant();
};

假设我正在创建 Animal 指针,然后动态分配新的 Zebra 和 Elephant 对象。如果我从不打算创建 Animal 对象,那么是否有任何实际需要显式创建 Animal 构造函数?

【问题讨论】:

  • If I never intend to create an Animal object 严格地说,每当您创建 Zebra 或 Elephant 对象时,您确实创建 Animal 对象。
  • 在这种特定情况下,不需要用户指定的构造函数,编译器会为您生成默认构造函数。在某些情况下,根据 C++ 语言级别和类的细节,将需要构造函数。如果省略一个,则不会导致编译错误,但无法构造类。
  • @tkausl 所以在创建 Zebra 或 Elephant 对象时会调用基类构造函数,因为它们在技术上是 Animal 对象?
  • @SamVarshavchik 谢谢山姆的回答。虽然编译不是必需的,但显式定义基类构造函数是否被认为是最佳实践?
  • “最佳实践”的好处在于每个人都有不同的做法。

标签: c++ inheritance


【解决方案1】:

您不需要显式提供构造函数。 生成一个默认的(如果您不提供其他构造函数)。

所以

class Animal
{
public:

    virtual ~Animal();
};

足够了。

派生类构造函数将调用基类构造函数(显式或隐式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2016-07-19
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多