C++ 抽象类的复制构造函数中存在问题

C++ 抽象类的复制构造函数中存在问题,c++,C++,如何在派生类的抽象类的副本构造函数中插入值 如果我删除虚函数并创建基类的对象,或者如果我更改复制构造函数,但我只能访问派生类,那么这个程序运行良好 class Book{ protected: string title; string author; public: Book(string t,string a){ title=t; author=a; }

如何在派生类的抽象类的副本构造函数中插入值

如果我删除虚函数并创建基类的对象,或者如果我更改复制构造函数,但我只能访问派生类,那么这个程序运行良好

class Book{
    protected:
        string title;
        string author;
    public:
        Book(string t,string a){
            title=t;
            author=a;
        }
        virtual void display()=0;
};


这就是你要找的吗

class MyBook: private Book
{
public:
    int price;

    MyBook(string t, string a, int p) : Book(std::move(t), std::move(a)) {
        price = p;
    }

    void display() override {

    }
};
顺便说一下,我不认为你在寻找复制构造函数。我认为您正在寻找显式构造函数。Book的复制构造函数将是Bookconst Book&另一个

我也有一些建议,如果你使用C++ 11或更高。 使用std::move避免不必要地复制字符串t。 使用override关键字,因为它可以帮助您在与基类的方法签名不完全匹配时生成编译器错误。它可以帮助你避免这种性质的错误。
这就是你要找的吗

class MyBook: private Book
{
public:
    int price;

    MyBook(string t, string a, int p) : Book(std::move(t), std::move(a)) {
        price = p;
    }

    void display() override {

    }
};
顺便说一下,我不认为你在寻找复制构造函数。我认为您正在寻找显式构造函数。Book的复制构造函数将是Bookconst Book&另一个

我也有一些建议,如果你使用C++ 11或更高。 使用std::move避免不必要地复制字符串t。 使用override关键字,因为它可以帮助您在与基类的方法签名不完全匹配时生成编译器错误。它可以帮助你避免这种性质的错误。
派生类构造函数的语法看起来不正确,您应该使用初始值设定项列表,如MyBookstring t,string a,int p:Bookt,a您发布的代码中没有复制构造函数。派生类构造函数的语法看起来不正确,您应该使用初始值设定项列表,如MyBookstring t,string a,intp:Bookt,在你发布的代码中没有复制构造函数。
class MyBook: private Book
{
public:
    int price;

    MyBook(string t, string a, int p) : Book(std::move(t), std::move(a)) {
        price = p;
    }

    void display() override {

    }
};