C++ 多级继承 - 调用基本构造函数错误

Posted

技术标签:

【中文标题】C++ 多级继承 - 调用基本构造函数错误【英文标题】:C++ multilevel inheritance - Calling Base Constructor Error 【发布时间】:2019-01-31 14:03:24 【问题描述】:

所以我有一个相当复杂的程序,我现在不想进入。我将包含一个相同过程的玩具示例,然后更详细地介绍它。

在我的程序中,我遇到了带有多级继承的错误constructor for 'Hunter' must explicitly initialize the base class 'WorldObject' which does not have a default constructorWorldObject -> Creature -> Hunter

为了重新创建相同的结构,我做了以下操作:

class Base

protected:
    int a;
public:
    Base(int a): a(a)  print("Base contructed"); 
    ~Base()  print("Base destroyed"); 
    virtual void printData() = 0;
;



class Derived1 : public Base

protected:
    int b;
public:
    Derived1(int a, int b): b(b), Base(a)  print("Derived1 contructed"); 
    ~Derived1()  print("Derived1 destroyed"); 
;


class Derived2 : public Derived1

protected:
    int c;
public:
    Derived2(int a, int b, int c) : c(c), Derived1(a, b)  print("Derived2 contructed"); 
    ~Derived2()  print("Derived2 destroyed"); 
    virtual void printData() //... 
; 

这里,Derived2 类的构造函数通过初始化列表创建了 Derived1,而这反过来又“间接”构造了 Base。这就像我预期的那样工作。

但是,在我的复杂代码中,Hunter 类需要显式调用 WorldObject 构造函数。这看起来像:

Hunter(sf::Texture &texture, float x, float y, sf::Font& font) : 
        WorldObject(texture,x, y, font),
        Creature(texture, x, y, font)
     //... 

这里,Creature 构造函数只是将每个参数传递给 WorldObject 构造函数。 WorldObject 只有这个构造函数:

WorldObject(sf::Texture& texture, float x, float y, sf::Font& font) : m_sprite(texture)
 //... 

使用的 Creature 构造函数如下所示:

    Creature(sf::Texture &texture, float x, float y, sf::Font& font) : 
    WorldObject(texture, x, y, font), 
    NN(n_input_units, n_hidden_units, n_output_units)
 //... 

为什么我需要在我的 Programm 中直接初始化 WorldObject 和 Creature,但在玩具示例中它可以在没有显式 Base 构造函数的情况下工作?

((预编译器也报错WorldObject没有默认构造函数,编译时出现上述错误))

【问题讨论】:

如你所见,你的真实代码不像简化的例子那样工作,所以问题出在你的真实代码中,很可能是你没有在这里写的部分。尝试简化实际代码,除非您意识到问题所在,或者除非您找到一个可以在此处发布的简短示例。 “所以我有一个相当复杂的程序,我现在不想进入”实际上它有多复杂并不重要,你应该尝试创建一个minimal reproducible example 我认为您应该包含您的实际课程,而不是 BaseDerived1Derived2 【参考方案1】:

我猜在您的复杂代码中,Hunter 直接继承自 WorldObject,而不是间接通过 Creature。如果Creature 继承WorldObject,则永远Hunter 不需要将任何参数传递给WorldObject

【讨论】:

@D.Niermann(已删除评论,但无论如何我暂时将其留在这里)请发布一个完整的、最小的示例来重现错误,然后。我看到 Creature 也继承自 NN 但这并没有太大变化......没有默认构造函数可能是一个完全不同的错误,可能是因为您使用了向量或其他一些容器 My Creature Class 实际上继承自 WorldObject,因此必须在 Hunter 构造函数中为 WorldObject 提供参数。现在我通过使其非虚拟来修复它。我必须再次查找虚拟继承以了解它修复错误的原因。仍然感谢您的回答,这让我质疑我的代码足以再次查看所有内容:)

以上是关于C++ 多级继承 - 调用基本构造函数错误的主要内容,如果未能解决你的问题,请参考以下文章

错误:在 C++ 中没有用于调用构造函数的匹配函数

用C++设计一个不能被继承的类(转)

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

C++ 使用继承时没有匹配的构造函数

C++提高:继承

C++提高:继承