【问题标题】:What is the term for an inheriting class constructor with different parameters?具有不同参数的继承类构造函数的术语是什么?
【发布时间】:2013-09-21 05:49:39
【问题描述】:

以下面的例子为例。您使用什么术语来描述具有与基类不同的参数的继承类?我了解subbase 隐含调用base()。你不会调用这个覆盖,对,因为基构造函数仍然被调用?

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

class base
{
public:
   base()
   {
      cout << "Hello!\n";
   }
};

class subbase : public base
{
public:
   subbase(string s)
   {
      cout << s << endl;
   }
};

int main()
{
   subbase test("Hello World!\n");

   return 0;
}

【问题讨论】:

  • 它只是一个构造函数。请记住,基础子对象也需要构建...
  • @Kerrek SB 是的,正如我在帖子中提到的,我知道 base() 被隐式调用。但是,如果有人想留下评论以与实现者交流,他希望继承的构造函数有参数,而基类没有,你会怎么说呢?
  • 我可能会谈论“派生类构造函数”或“从基类派生的类中的构造函数”。
  • 我不会使用“重载”,因为在基类和派生类构造函数之间从来没有任何重载决议(它们有不同的名称)。我会说它像“派生类中的构造函数应该与这个构造函数有不同的签名(base构造函数)”。也就是说,这似乎是一件毫无意义的事情,因为派生类的全部意义在于允许状态变化,因此通常期望它们不会总是具有与基类相同的构造参数。
  • @jmstoker 它没有超载。它是“派生类构造函数的参数应该与基类构造函数的参数不同”。

标签: c++ inheritance terminology


【解决方案1】:

超载了我的朋友。它具有相同的方法名称,但参数或返回类型不同

但在这种情况下,您只是在创建全新的构造函数。不是真的继承什么的。

【讨论】:

  • 我已经被上面的 cmets 说服,重载不适用。
【解决方案2】:

重载:当您更改派生类中继承函数的签名时。

重定义(在普通函数的情况下)/覆盖(在虚函数的情况下):当您在派生类中保持基类函数的签名相同时。但是你改变了实现部分。

但我在这里不是在谈论构造函数。我说的是类的常用成员函数。

【讨论】:

  • 您对成员函数的看法是对的,但这个问题严格来说是在谈论构造函数。
  • 我会冒险猜测您可能正在谈论构造函数初始化列表。如果需要,您可以将参数从派生类 cTor 传递给基类 cTor。通过省略它,您可以提示基类 cTor 实际上不需要派生类 cTor 中的任何内容
  • 重载不是我在帖子中描述的正确术语,因为正如@Mankarse 在 cmets 中指出的那样,基本构造函数和派生构造函数具有不同的名称。如果可以的话,我会将他的评论标记为答案,但他从未发布过官方解决方案。
猜你喜欢
  • 2012-04-16
  • 2020-06-23
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多