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

标签 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)

为什么我会得到这个?我不是用过它说的候选构造函数吗? 我觉得我已经阅读了所有关于构造函数链的教程,但我仍然不明白我应该做些什么。

感谢您的帮助!

最佳答案

我不认为你已经发布了你的例子的所有相关代码,因为上面的代码是用 g++ 为我编译的。

也就是说,然而,我可以从错误消息中猜到 Subclass 在某处有一个默认构造函数,或者您尚未在示例中发布的其他第二个构造函数,定义如下:

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

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

另一种可能性是:您已经创建了另一个没有构造函数的 SuperClass 子类,因此 C++ 正在生成一个隐式默认构造函数。但是,C++ 生成的隐式构造函数找不到要调用的默认父类(super class)构造函数。

关于c++ - 对 C++ 中的构造函数链感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9741626/

相关文章:

java - Play框架的模板引擎中是否有 "instanceof"功能?

c# - 如何解决密封类的不可能继承?

c# - “删除”基础成员?

c++ - 找不到命名空间,尽管它就在那里

c++ - QDockWidget showFullscreen 在 Ubuntu (gnome) 上不工作

C++伪随机数生成平台依赖

c++ - Windows资源源文件#define的含义

c++ - cloud9 c++开发环境如何添加c++库

C++模板类中嵌套类的静态成员变量

java - 初始化子类中不同类型的 'final' 字段