减少父子类代码重复

时间:2012-08-28 06:15:55

标签: c++ oop parent-child

我遇到了多态性和父子关系的问题。采取以下两个类,并在我的应用程序中想象我创建一个'child'对象。在对象之外,我调用的唯一函数是update(),它反过来调用对象中我需要的所有其他东西。这个调用序列中唯一一个在'parent'和'child'中不同的函数是dosomething2()。

class parent 
{
    public:
        void dosomething1() {}; //amongst other things, calls dosomething2
        void dosomething2() {};
        void update() {}; //amongst other things, calls dosomething1
}

class child : public parent
{
    void dosomething2() {}
}

我意识到如果我创建一个'child'对象并调用update(),那么只会调用父类函数。我不得不将update()和dosomething1()复制到子类,然后一切按预期工作。这不是一个非常好的解决方案,因为有很多重复的代码 - 有没有办法改善这个?

更新 感谢提供的答案,我使用虚拟dosomething2()函数更新了父类。现在调用了正确的函数,我不必将dosomething1()复制到子类。不幸的是,如果我不将update()复制到子类,我会得到符号查找错误(父和子都在一起存在于库中)。

class parent 
{
    public:
        void dosomething1() {}; //amongst other things, calls dosomething2
        virtual void dosomething2() {};
        void update() {}; //amongst other things, calls dosomething1
}

class child : public parent
{
    void dosomething2() {}
    /*void update() {}; //symbol lookup error if this is left uncommented */
}

UPDATE2 符号查找错误与代码无关。我做了一个make clean,然后make(构建一个.so库和可执行文件),现在事情按预期工作了。

3 个答案:

答案 0 :(得分:3)

您没有将基类中的函数标记为虚拟:

class parent 
{
    public:
        virtual void dosomething1() {}; //amongst other things, calls dosomething2
        virtual void dosomething2() {};
        void update() {}; //amongst other things, calls dosomething1
}

此外,仅供参考,您正在做的事情称为template method pattern

答案 1 :(得分:2)

如果您需要virtual,则应在父类中使用关键字dynamic-polymorphism。然后在子类中重新实现或不重新实现虚函数。

class parent 
{
    public:
        void dosomething1() {}; //amongst other things, calls dosomething2
        virtual void dosomething2() {};
        void update() {}; //amongst other things, calls dosomething1
}

答案 2 :(得分:1)

您应该制作相关的功能virtual。假设您希望通过调用child来调用doSomething1()的{​​{1}}和doSomething2()

update()

然后,调用class parent { public: virtual void dosomething1() {}; //amongst other things, calls dosomething2 virtual void dosomething2() {}; void update() {}; //amongst other things, calls dosomething1 } class child : public parent { virtual void dosomething2() {} } 的{​​{1}}将调用派生类的方法(如果可用)。请注意,child更新update() child`或您将隐藏该名称。