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