C ++调用继承的构造函数

时间:2014-02-27 20:43:44

标签: c++ inheritance

我有一个头文件“Item.h”,“Sword.h”继承了这样的文件:

#ifndef SWORD_H
#define SWORD_H

#include "Item.h"

class Sword: public Item {
public:
    Sword(int damage);
    ~Sword();
};
#endif

我的Item.h是这样的:

#ifndef ITEM_H
#define ITEM_H

class Item{
public:
   int damage;

   Item(int damage);
   int GetDamage();
};
#endif

然后我有一个文件“Sword.cpp”,我想调用Item构造函数(这是Item.cpp):

#include "Item.h"

Item::Item(int damage)
{
   this->damage = damage;
}

int Item::GetDamage()
{
   return damage;
}

我基本上希望Sword.cpp成为Item.cpp的子类,这样我就可以使用Item的函数,并从Sword.cpp中设置Damage等变量。我被告知在C ++中没有办法继承构造函数,所以我怎么能这样做呢?有些答案似乎使用了显式关键字,但我永远无法使用它。

请帮忙吗?

4 个答案:

答案 0 :(得分:2)

您实际上可以继承构造函数。它是全有或全无,你不能选择哪一个。你就是这样做的:

class Sword: public Item {
public:
    using Item::Item;
    ~Sword();
};

如果你坚持使用pre-C ++ 11编译器,那么你需要声明构造函数并自己实现它。这将是Sword.cpp中的实现:

Sword::Sword(int damage) : Item(damage) {}

答案 1 :(得分:1)

您不继承构造函数,因为构造函数与类具有相同的名称(显然父级和子级必须具有不同的名称)。但是你可以在子的构造函数

中使用父的构造函数
    Sword()
    : Item(3)    // Call the superclass constructor and set damage to 3
    {
        // do something 
    }

答案 2 :(得分:1)

您可以通过以下方式定义Sword构造函数

Sword(int damage) : Item( damage ) {}

如果Item的析构函数是虚拟的并且数据成员损坏应该具有受保护的访问控制,那么也会更好。例如

class Item{
protected:
   int damage;
public:
   Item(int damage);
   virtual ~Item() = default;
   int GetDamage();
};

答案 3 :(得分:0)

您可以从派生类的构造函数中调用父的构造函数,如下所示:

Sword(int damage): Item(damage) { }