C ++继承父类构造函数的子类

时间:2014-03-18 04:38:49

标签: c++ inheritance polymorphism

我有一个赋值,需要从基类派生两个类。我在获取派生类以调用基类构造函数并成功设置继承变量时遇到问题。为简单起见,我用虚拟程序重新创建了这个问题,因为赋值要长得多。

#include <iostream>

class ParentClass {
    public:
            ParentClass(int theField1, int junk);
            ParentClass() {}
            virtual void printField();
            virtual void setField(int nf);

    protected:

            int field1;
};

class ChildClass : public ParentClass {
    public:
            ChildClass(int theField1);
            void printField();
            void setField(int nf);
};

ParentClass::ParentClass(int theField1, int junk) {
    field1 = theField1;
}

ChildClass::ChildClass(int theField1) {
    ParentClass::ParentClass(theField1, 3);
}

void ParentClass::printField() {
    std::cout << "The field = " << field1 << std::endl;
}

void ChildClass::printField() {
    ParentClass::printField();
    std::cout << "Some other stuff." << std::endl;
}

void ParentClass::setField(int nf) {
    field1 = nf;
}

void ChildClass::setField(int nf) {
    ParentClass::setField(nf);
}

int main() {
    ChildClass* myChild = new ChildClass(777);
    ChildClass child2(888);
    myChild->printField();
    child2.printField();

    myChild->setField(10);

    myChild->printField();

    child2.setField(20);
    child2.printField();

    return 0;
}

运行它会给我以下输出:

The field = 0
Some other stuff.
The field = 4197296
Some other stuff.
The field = 10
Some other stuff.
The field = 20
Some other stuff.

为什么前两次尝试不起作用?调用构造函数应该将变量初始化为作为参数传递的值,但在我专门调用mutator函数之前,它们实际上并未设置。我尝试了第三个类,它在构造函数中使用了父mutator函数,而不是父构造函数:

class StepChild : public ParentClass {
    public:
            StepChild(int nf);
};

StepChild::StepChild(int nf) {
    ParentClass::setField(nf);
}

main中定义的对象:

    StepChild* step = new StepChild(30);
    step->printField();

输出:

The field = 30

我在哪里错误地尝试使用父构造函数未正确初始化这些变量?

我也尝试将父类更改为非虚拟类,并且它也可以工作,所以它似乎不是父类的问题。

3 个答案:

答案 0 :(得分:2)

使用initialiser lists

ParentClass::ParentClass(int theField1, int junk)
  : field1(theField1)
{ }

ChildClass::ChildClass(int theField1)
  : ParentClass(theField1, 3)
{ }

以下内容 - 从您的代码中 - 创建一个临时的ParentClass对象并将其抛弃 - 这对正在构建的ChildClass对象没有影响:

 ParentClass::ParentClass(theField1, 3);   // temporary

答案 1 :(得分:1)

如果你使参数匹配,你也可以通过放置

来实现c ++ 11方式
using ParentClass::ParentClass( int, int );
您的ChildClass类定义中的

。它与从ChildClass构造函数初始化列表中调用父构造函数相同,但稍微不那么深奥。

答案 2 :(得分:0)

不确定,但我发现你调用基类构造函数的方式有问题。

try this way to call base class constructor并查看问题是否已解决。