对C ++中的构造函数链感到困惑

时间:2012-03-16 17:13:38

标签: c++ inheritance

我在C ++(对于一个类)的单例类中工作了很多,现在对于一个非类项目,我试图使用继承的类。

出于某种原因,我对构造函数链非常重视。

请考虑以下事项:

class SuperClass
{
    string privateKey;
    string publicKey;
    string name;

public:
    enum Key {PUBLIC, PRIVATE};
    SuperClass(Key, string);
};

SuperClass::SuperClass(Key key, string theKey)
{
    switch(key)
    { 
        case PUBLIC: publicKey = theKey;
                     break;
        case PRIVATE: privateKey = theKey;
                     break;
    }
}


class SubClass : private SuperClass
{
public:
    SubClass(string key);
};

SubClass::SubClass(string key)
: SuperClass(SuperClass::PUBLIC, key) // "SubClass" will only interact with the public key, in this case.
{
    cout << "I'm instantiated!" << endl;
}

int main()
{
    SubClass example ("thisIsThePublicKey");
    return 0;
}

编译时,我收到以下错误:

error: no matching function ncall to SuperClass::SuperClass()
note: candidates are: SuperClass::SuperClass(SuperClass::Key, std::string)

为什么我会这样?我没有使用它说是候选人的构造函数吗? 我觉得我已经阅读了关于构造函数链的每个教程,但我仍然没有得到我应该以不同方式做的事情。

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

我认为您没有为您的示例发布所有相关代码,因为上面的代码使用g ++为我编译。

那说,但是,我可以从错误消息中猜出Subclass在某个地方有一个默认构造函数,或者你还没有在你的例子中发布的其他第二个构造函数,定义如下:

SubClass::SubClass() // No argument constructor
{
    cout << "Default constructor (no initialization)." << endl;
 }

这将隐式尝试调用SuperClass :: SuperClass()默认构造函数。通常,如果您根本不提供任何构造函数,C ++将为您生成默认构造函数。但是,由于您已经定义了一个为SuperClass提取参数的构造函数,因此C ++不会为它生成默认构造函数。

另一种可能性是:你创建了SuperClass的另一个子类,没有构造函数,因此C ++正在生成一个隐式的默认构造函数。但是,C ++生成的隐式构造函数无法找到要调用的默认SuperClass构造函数。

答案 1 :(得分:1)

我相信你忘了继承你的超级班:

class SubClass

应该是:

class SubClass : public SuperClass

答案 2 :(得分:0)

首先,我在SubClass定义中看不到指定继承的位置。公共继承必须是这样的:

class SubClass : public SuperClass
{
 // definition
}

答案 3 :(得分:0)

您必须继承SuperClass

class SubClass : public SuperClass
{
public:
    SubClass(string key);
};

如果我使用私有继承,你的例子编译也很好。