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

C++ 调用非公共基类虚函数的派生类,c++,oop,inheritance,virtual-functions,base-class,C++,Oop,Inheritance,Virtual Functions,Base Class,编辑: 这个问题已经提出了 但对我的情况没有帮助。我试图用继承的publicupdate()函数建立类的层次结构。但是我希望给定的派生类在进行自己的处理之前调用其所有基类的功能。我的实际VS2013解决方案包含一个引用DLL项目的EXE项目,但下面的简化代码仍然会产生错误: // Map.h (in DLL project) namespace Game2D { class Map { public: explicit Map(); ~Map();

编辑:

这个问题已经提出了 但对我的情况没有帮助。我试图用继承的public
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...
    }
}
这给了我一个编译器错误“error C2084:function'void Game2D::AutoScrollMap::baseUpdates(double)'已经有一个主体”。上面的文章说,我可以使用这种语法调用正在重载的函数。但是,其示例中的基函数是公共的,不受保护,我确实希望保持baseUpdates()受保护,因为它不是接口的一部分


我认为这个问题是OOP继承范例的一个相当基本的用法,所以我遗漏了什么呢?非常感谢您的建议

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

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


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

此外,您的基本构造函数也没有实现。

哇,试图将此代码简化为最简单的帮助形式实际上暴露了问题。我已经在AutoScrollMap.h中的baseUpdates()后面放了大括号“{}”,因此出现了“函数已经有主体”错误。看起来您确实可以从派生重写调用基虚拟函数,即使基函数不是公共的!抱歉浪费大家的时间,哈哈。

我看不出有什么问题。请发布一个.anMCVE。我希望上面的代码足够小/完整。我的实际解决方案将Base和Derived1类放在它们自己的名称空间中,它们从DLL项目导出。Derived2类位于引用DLL的EXE项目中的另一个命名空间中。我得到了链接器错误,即使没有一个main()函数,它实际上会初始化这些类中的任何一个。问题是你声称有些东西不起作用(不会编译),但在我的MVCE中它确实可以编译。那么,您试图解决的问题是什么呢?很抱歉花了这么长时间,但是我编辑了示例中的代码,现在它应该可以作为有效的MVCE。再次感谢你的帮助。谢谢@swang。在我的项目中,这些类实际上被分成.h和.cpp文件。h只是声明baseUpdates(),我在Derived2.cpp中定义了它。与Derived1相同。问题似乎是Derived1::baseUpdates()和Derived2::baseUpdates()都有主体,但idk为什么这会是一个问题不应该是这样的,如果您发布导致错误的实际代码,可能会更有用。很抱歉花了这么长时间,但我在示例中编辑了代码,现在它应该作为有效的MVCE。再次感谢你的帮助。