派生类调用非公共基类虚拟函数
Derived Class Calling Non-Public Base Class Virtual Function
编辑:
这个问题已经在这里被问过了但对我的情况没有帮助。我正在尝试使用继承的公共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继承范式的一个相当基本的使用,那么我缺少什么呢?非常感谢所有的建议!
您描述的方法没有问题,问题出在您的代码中。您已经内联实现了Derived2::baseUpdates(),然后尝试再次定义它。您应该将Derived2更改为:
class Derived2 : public Derived1 {
public:
Derived2() : Derived1() { }
protected:
virtual void baseUpdates();
};
void Derived2::baseUpdates() {
Derived1::baseUpdates();
}
此外,您的Base构造函数也未实现。
哇,试图将此代码简化为最简单的形式以获得帮助实际上揭示了问题。我已经在AutoScrollMap.h中的baseUpdates()后面放了大括号"{}",因此出现了"函数已经有正文"错误。看起来您确实可以从派生重写中调用基本虚拟函数,即使基本函数不是公共的!很抱歉浪费了大家的时间,哈哈。
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 子类地址等于虚拟基类地址?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 虚拟基类函数中派生类的大小
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 虚拟基类初始化
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 无法使用在子类中定义的虚拟getter实现基类
- C++虚拟函数:基类函数是调用的,而不是派生的
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- 派生类调用非公共基类虚拟函数
- 使用基类虚拟方法
- 强制调用基类虚拟函数
- 强制调用长链下的基类虚拟函数
- 通过派生类虚拟方法调用基类虚拟方法