C++ 如何在抽象类中调用和使用复制构造函数?

C++ 如何在抽象类中调用和使用复制构造函数?,c++,class,inheritance,virtual,abstract,C++,Class,Inheritance,Virtual,Abstract,我有一个作业要求我使用复制构造函数。假设我们有以下代码: class Animal /*abstract class*/ { private: string name; int age; public: Animal(); ~Animal(); virtual int is_bad() = 0; } class Dog : public Animal { public: Dog(); ~Dog(); int is_bad()

我有一个作业要求我使用复制构造函数。假设我们有以下代码:

class Animal   /*abstract class*/
{
private:
    string name;
    int age;
public:
    Animal();
    ~Animal();
    virtual int is_bad() = 0;
}

class Dog : public Animal
{
public:
    Dog();
    ~Dog();
    int is_bad() {
        return 0;
    }
}

/*constructors*/

Animal::Animal(int age,string name)
{
    this->age=age;
    this->name=name;
}

Dog::Dog(int age, string name) : Animal(age,name)
{
    cout << "Woof" << endl;
}

/*main*/

int main()
{
    Animal * c;

    c = new Dog(10,"rex");

    return 0;
}
class Animal/*抽象类*/
{
私人:
字符串名;
智力年龄;
公众:
动物();
~Animal();
虚拟int为_bad()=0;
}
犬类:公共动物
{
公众:
狗();
~Dog();
int是坏的(){
返回0;
}
}
/*建设者*/
Animal::Animal(整数年龄,字符串名称)
{
这个->年龄=年龄;
此->名称=名称;
}
Dog::Dog(int年龄,字符串名称):Animal(年龄,名称)
{

cout当您使用
动物*
指向
对象时,您不能使用复制构造函数。您需要实现
克隆()
函数

int main()
{
    Animal * c;

    c = new Dog(10,"rex");
    Animal* newDog = c->clone();

    return 0;
}
其中
clone()
声明如下:

class Animal   /*abstract class*/
{
private:
    string name;
    int age;
public:
    Animal();
    ~Animal();
    virtual Animal* clone() const = 0;
    virtual int is_bad() = 0;
};
clone()
可以使用复制构造函数在
Dog
中实现

class Dog : public Animal
{
public:
    Dog();
    ~Dog();

    virtual Dog* clone() const { return new Dog(*this); }

    int is_bad() {
        return 0;
    }
};
当您有一只
狗*
时,您可以直接使用复制构造函数

int main()
{
    Dog * c;

    c = new Dog(10,"rex");

    Dog* newDog = Dog(*c);

    return 0;
}

如果不编写复制构造函数,编译器将添加一个默认构造函数,用于复制该对象的所有成员。 就你的情况(作业)而言,我想你应该写一篇

要调用复制构造函数,您有两种选择:

Dog a(10, "rex");
Dog b(a); // it's calling the copy constructor
Dog c=a; // it's still calling the copy constructor

我想做的是通过复制构造函数创建对象
Dog
的副本。我认为,因为
class Animal
是一个抽象类,而且在我的作业中,我在类中也有一个指针,调用默认构造函数会给我错误非常
Animal
我希望它们的指针值保持不变,并指向某个对象调用默认构造函数。总之,我只是感到困惑,因为调用
Dog
的构造函数时,我必须使用初始化列表来赋值,并认为相同的值也适用于复制构造函数。感谢所有的帮助伙计们帮忙。

什么是
生物
动物
?你的代码中没有定义
生物
-你是说
动物
?你想要一个复制构造函数,它接受一只现有的
还是一只现有的
动物
?这将改变你在程序中使用它的方式。你需要添加一个
病毒al
function
clone()
make_copy()
。在SO中搜索这些函数。这是您分配的代码吗?在现实生活中,我会说“不要定义复制构造函数,编译器生成的构造函数很好”。你知道复制构造函数的签名应该是什么吗?@RSahu-问题是关于复制
Dog
对象,而不是通过基类指针进行克隆。实际上,你可以直接使用复制构造函数(使用原始版本的
c
Animal*newDog=newDog(*static_cast(c))
根据预期用途的不同,OP最好使用克隆方法。但问题还没有弄清楚。@JSF,我不建议使用
newdog(*static_cast(c))
即使它适用于这个简单的示例。我想做的是通过复制构造函数创建object
Dog
的副本。我认为因为类
Animal
是一个抽象类,而且在我的作业中,类中也有一个指针,调用默认构造函数会给我带来错误但是,由于在每个
动物中,我希望它们的指针值保持不变,并指向某个对象调用默认构造函数。总之,我只是感到困惑,因为调用
狗的构造函数时,我必须使用初始化列表来赋值,并认为相同的值也适用于复制构造函数s、 然而,我不明白你的意思,因为在每种动物身上,我都希望它们的指针值保持不变,并指向某个调用默认构造函数的对象。@R Sahu我想,因为我的赋值中有指针,在类
动物
内,我将无法使用默认构造函数。然后,我意识到ed说我希望我的类中的指针都指向一个特定的对象。因此,默认的复制构造函数只复制值(我希望我没有错)这一事实并不困扰我。无论如何,我想我实际上不知道该语言是如何工作的,因此感到困惑。谢谢你的帮助。