如何调用父类复制构造函数?

时间:2014-07-31 10:20:32

标签: c++ class inheritance copy-constructor

我遇到了复制构造函数的继承问题。 当我尝试复制一个类时,不会调用父类的复制构造函数。这是一个总结问题的示例程序:

#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) {}

这通过调用父复制构造函数

来解决整个问题

感谢大家的快速回复!

3 个答案:

答案 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。