编辑:
此问题已被提出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继承范式的一个相当基本的用途,所以我错过了什么?非常感谢所有建议!
答案 0 :(得分:1)
您描述的方法没有问题,问题出在您的代码中。您已经实现了Derived2 :: baseUpdates()内联,然后再次尝试定义它。您应该将Derived2更改为:
class Derived2 : public Derived1 {
public:
Derived2() : Derived1() { }
protected:
virtual void baseUpdates();
};
void Derived2::baseUpdates() {
Derived1::baseUpdates();
}
您的Base构造函数也未实现。
答案 1 :(得分:0)