我遇到了复制构造函数的继承问题。 当我尝试复制一个类时,不会调用父类的复制构造函数。这是一个总结问题的示例程序:
#include <iostream>
//parent class
class cParent
{
public:
//parent data
int iParentData;
//default constructor
cParent(void) : iParentData(0) {}
//copy constructor
cParent(const cParent& SOURCE) : iParentData(SOURCE.iParentData) {}
};
//child class
class cChild : public cParent
{
public:
//child data
int iChildData;
//default constructor
cChild(void) : iChildData(0) {}
//copy constructor
cChild(const cChild& SOURCE) : iChildData(SOURCE.iChildData) {}
};
int main()
{
cChild SourceClass; //create a class
SourceClass.iParentData = 10; //and set some values
SourceClass.iChildData = 10; //
cChild CopyClass(SourceClass); //use the copy constructor
std::cout << "Parent Data: " << CopyClass.iParentData << std::endl; //magic, this is 0
std::cout << "Child Data: " << CopyClass.iChildData << std::endl; //and this is 10
return 0;
}
输出:
Parent Data: 0
Child Data: 10
很明显,子类的复制构造函数被调用,但父类调用默认构造函数。 有没有办法在子类复制构造函数中强制调用父类复制构造函数?
提前感谢您的帮助:)
*编辑:
对于每个想要了解的人来说,解决方案很简单:
//copy constructor
cChild(const cChild& SOURCE) : cParent(SOURCE), iChildData(SOURCE.iChildData) {}
这通过调用父复制构造函数
来解决整个问题感谢大家的快速回复!
答案 0 :(得分:5)
cChild(const cChild& other ) : cParent( other ), iChildData( other.iChildData) {}
您隐式调用了cParent
默认构造函数。
顺便说一下,关于符号:
最好为宏符号保留ALL UPPERCASE
。这样你就可以避免在读者耳中大喊大叫,减少无意中文字替换的可能性。
最好避免使用匈牙利语前缀表示法。特别是使用c
为类名添加前缀只会降低代码的可读性。微软这样做是因为他们通常采用各种最差的做法(void main
等),但我们可以做得更好!
写(void)
表示没有参数是C-ism,C ++中不必要的详细程度。
答案 1 :(得分:0)
以下是示例:
struct Parent
{
Parent()
{
std::cout << "Parent::Parent()\n";
}
Parent(const Parent&)
{
std::cout << "Parent::Parent(const Parent&)\n";
}
};
struct Child: public Parent
{
Child()
{
std::cout << "Child::Child()\n";
}
Child(const Child& c)
: Parent(c)
{
std::cout << "Child::Child(const Child&)\n";
}
};
int main()
{
Child c1;
Child c(c1);
}
你应该得到的输出:
Parent::Parent()
Child::Child()
Parent::Parent(const Parent&)
Child::Child(const Child&)
答案 2 :(得分:-2)
如果编译器只是使用默认构造函数初始化派生类的数据成员对象,则不会显式调用父复制构造函数。 所以你必须写
cChild(const cChild& SOURCE) : cParent( SOURCE ), iChildData(SOURCE.iChildData) {}
请参阅more detailed my description of the situation
虽然它是用俄语写的,但您可以使用Google服务转换器将其翻译成Englich。