【问题标题】:How is a constructor for a derived class supposed to be like in c++ when derived class has added data member当派生类添加了数据成员时,派生类的构造函数应该如何在 C++ 中
【发布时间】:2015-01-05 09:42:12
【问题描述】:

我是 C++ 新手。我一直在努力克服这个错误。我知道当一个类在派生时,它继承了基类的所有内容,但是如果派生类有其他数据成员怎么办?构造函数应该是怎样的?

当我尝试只放置新的时,我尝试将参数传递给构造函数中新创建的类成员,我收到一个错误,说它与基类的不匹配。当我尝试使用基类并添加新的数据成员时,它告诉我我正在重新定义。所以我想知道要克服这个错误,我的代码还剩下什么。

这是基类:

class movielibrarybase
{


public:
        movielibrarybase(string name, string dirname, string gen, int price);

        void setname(string name);
        string getname();

        void setdirector_name(string dirname);
        string getdirector_name();

        void setgenre(string gen);
        string getgenre();


        void setprice(int price);
        int getprice();

        void display();

        ~movielibrarybase();

    protected:
    string name;
    string director_name;
    string genre;
    int price;
};

这是派生类:

class songlibrary: public movielibrarybase
{
    public:
        songlibrary();


        void setartist_name(string name);
        string getartist_name();



        void setsong_position(string position);
        string getsong_position;

        ~songlibrary();


    protected:

    string artist_name;
    string song_postion;
};

我收到以下错误:

songlibrary.cpp||在构造函数'songlibrary::songlibrary(std::string, std::string, std::string, int, std::string, std::string)':| songlibrary.cpp|6|错误:没有匹配函数调用“movielibrarybase::movielibrarybase()”| movielibrarybase.cpp|3|注意:候选对象是:movielibrarybase::movielibrarybase(std::string, std::string, std::string, int)| movielibrarybase.h|8|注意:movielibrarybase::movielibrarybase(const movielibrarybase&)| songlibrary.cpp|34|error: no 'std::string songlibrary::getsong_position()' member function声明在类'songlibrary'|

【问题讨论】:

  • 如果您的计算机有鼠标,请使用它来复制实际的编译器消息并将它们粘贴到问题编辑框中。

标签: c++ class inheritance


【解决方案1】:

在这种情况下,您可以使用构造函数中的成员初始化器列表来调用基类中的正确构造函数:

 songlibrary::songlibrary(string name, string dirname, string gen, int price,
         string artist_name, string song_position)
 : movielibrarybase(name, dirname, gen, price), // initialize base class
   artist_name(artist_name), // initialize member in this class
   song_position(song_position) {
   // other ctor stuff
 }

如果您没有在该列表中声明父类,它将默认为默认构造函数。由于您的movielibrarybase 类中没有默认构造函数,因此发生了编译器错误。

【讨论】:

    【解决方案2】:

    在你的情况下,它会是这样的:-

    songlibrary::songlibrary( string n, string director, string gen, 
                              int pri, string artist, string song )
    
                         : movielibrarybase( n, director, gen, pri ), 
                           artist_name( artist ), song_postion( song )
    

    这里要注意的一点是成员初始化列表中的顺序很重要。首先调用应该是基类,然后是派生类成员应该按照它们在类中声明的顺序进行初始化

    此外,类成员按照它们在类中的声明顺序进行初始化,它们在成员初始化列表中列出的顺序并没有什么区别

    【讨论】:

    • 成员初始化器列表中的序列,正如您在第二个语句中提到的,无关紧要。唯一需要注意的是,在其中使用不同的顺序不会改变有效的初始化顺序(编译器通常会给出警告)。
    • @E_net4 有时这很重要......我不想用不必要的细节把这个页面弄得一团糟......提出一个单独的问题,我会给你一个合理的例子
    • 请注意,在每个部分中保持相同的顺序也是我编码实践的一部分。 @ravi 不需要单独的问题,但现在你让我对这样的例子感到好奇。也许聊天室或其他消息传递方式会很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2014-03-16
    • 2023-04-07
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多