派生类调用非公共基类虚函数

时间:2015-02-15 16:10:41

标签: c++ oop inheritance virtual-functions base-class

编辑:

此问题已被提出here 但在我的情况下没有帮助。我正在尝试使用继承的公共update()函数来创建类的层次结构。但我希望给定的派生派生类在进行自己的处理之前调用其所有基类的功能。我的实际VS2013解决方案包含一个引用DLL项目的EXE项目,但下面的简化代码仍会产生错误:

// Map.h (in DLL project)
namespace Game2D {
    class Map {
    public:
        explicit Map();
        ~Map();
        void update(double);
    protected:
        virtual void baseUpdates(double dt) {}
    };
}

// Map.cpp (in DLL project)
namespace Game2D {
    Map::Map() { }
    Map::~Map() {}
    void Map::update(double dt) {
        baseUpdates(dt);
        // Do some base stuf...
    }
}

// AutoScrollMap.h (in DLL project)
namespace Game2D {
    class AutoScrollMap : public Map {
    public:
        explicit AutoScrollMap();
        ~AutoScrollMap();
    protected:
        virtual void baseUpdates(double) {}
    };
}

// AutoScrollMap.cpp (in DLL project)
namespace Game2D {
    AutoScrollMap::AutoScrollMap() : Game2D::Map() {}
    AutoScrollMap::~AutoScrollMap() {}
    void AutoScrollMap::baseUpdates(double dt) {
        // Do some stuff...
    }
}

// DesertMap.h (in EXE project)
namespace Shooter {
    class DesertMap : public Game2D::AutoScrollMap {
    public:
        explicit DesertMap();
        ~DesertMap();
    protected:
        virtual void baseUpdates(double);
    };
}

// DesertMap.cpp (in EXE project)
namespace Shooter {
    DesertMap::DesertMap() : Game2D::AutoScrollMap() {}
    DesertMap::~DesertMap() {}
    void DesertMap::baseUpdates(double dt) {
        AutoScrollMap::baseUpdates(dt);
        // Do more specific stuff...
    }
}

这给了我一个编译错误“错误C2084:函数'void Game2D :: AutoScrollMap :: baseUpdates(double)'已经有了一个”。上面的文章说我可以使用这种语法来调用正在重载的函数。但是,它的示例中的基本函数是公共的,不受保护,我真的希望保持baseUpdates()不受保护,因为它不是接口的一部分。

我认为这个问题是OOP继承范式的一个相当基本的用途,所以我错过了什么?非常感谢所有建议!

2 个答案:

答案 0 :(得分:1)

您描述的方法没有问题,问题出在您的代码中。您已经实现了Derived2 :: baseUpdates()内联,然后再次尝试定义它。您应该将Derived2更改为:

class Derived2 : public Derived1 {                                              
    public:                                                                     
        Derived2() : Derived1() { }                                             
    protected:                                                                  
        virtual void baseUpdates();                                             
};                                                                              


void Derived2::baseUpdates() {                                                  
    Derived1::baseUpdates();                                                    
}

您的Base构造函数也未实现。

答案 1 :(得分:0)

哇,尝试将此代码简化为最简单的形式以获得帮助实际上揭示了这个问题。我已经在AutoScrollMap.h中的baseUpdates()之后添加了大括号“{}”,因此“函数已经有正文”错误。看起来你肯定可以从派生覆盖中调用基本虚函数,即使基函数不公开!抱歉浪费每个人的时间,哈哈。