【问题标题】:Default constructor for an inherited class继承类的默认构造函数
【发布时间】:2011-05-20 03:01:10
【问题描述】:

我已将问题简化为以下示例代码:

class pokemon{
    public:
        pokemon(int n);
};

class MewTwo : public pokemon {
    public:
        MewTwo(int n);
};

MewTwo::MewTwo(int n) {}

这会产生错误:

没有匹配的调用函数 ‘口袋妖怪::口袋妖怪()’

认为正在发生的是,当我尝试编写不存在的 MewTwo 构造函数时,会调用 pokemon 的默认构造函数。我对 C++ 比较陌生,所以我只是在这里猜测。有什么想法吗?

限制:修复无法修改或添加公共成员到类。

【问题讨论】:

    标签: c++ inheritance default-constructor


    【解决方案1】:

    其实你要找的是成员初始化列表。将继承的类构造函数更改为以下内容:

    class MewTwo : public pokemon {
        public:
            MewTwo(int n) : pokemon(n) {}
    };
    

    您在确定发生了什么方面是正确的。基本上,当您创建继承类时,您首先创建基类并且您不能这样做,因为没有定义默认构造函数。成员初始化列表可帮助您解决这个问题:)

    查看:http://www.cprogramming.com/tutorial/initialization-lists-c++.html 了解更多示例!

    【讨论】:

    • 我从未听说过成员初始化列表,感谢您提供的链接,它现在非常有意义! :)
    【解决方案2】:

    试试这个:

    class pokemon{
        public:
            pokemon(int n);
    };
    
    class MewTwo : public pokemon {
        public:
            MewTwo(int n) :pokemon(n){}
    };
    

    【讨论】:

    • +1。基类和成员在派生类的构造函数代码运行之前被初始化。如果您不希望将默认构造函数用于此目的,则必须指定要使用的构造函数以及要传递的参数。这是通过初始化列表完成的,如图所示。在基类中,您定义了一个构造函数,它禁止创建默认构造函数。
    猜你喜欢
    • 2016-03-24
    • 2017-10-04
    • 2015-07-09
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多