【发布时间】:2019-07-30 12:04:28
【问题描述】:
这段代码演示了这个问题:
class Base
{
public:
explicit Base(std::function<void()> const& printFunc) :
_printFunc(printFunc)
{
}
void print()
{
_printFunc();
}
private:
std::function<void()> _printFunc{};
private:
virtual void _print() = 0; // If this line is commented out, then
// `Subclass1::_print()` can be called.
};
class Subclass1 : public Base
{
public:
explicit Subclass1() :
Base([this]() { _print(); })
{
}
private:
void _print() /*override*/
{
std::cout << "Subclass1\n";
}
};
class Subclass2 : public Base, public Subclass1
{
public:
using fromLowestSubclass = Base;
public:
explicit Subclass2() :
Base([this]() { _print(); }), Subclass1()
{
}
private:
void _print() /*override*/
{
// Here is the problem:
Subclass1::print(); // or: static_cast<Subclass1*>(this)->print();
std::cout << "Subclass2\n";
}
};
int main()
{
Subclass2 sc2{};
sc2.fromLowestSubclass::print();
return 0;
}
在Subclass2::_print 方法中,应该调用覆盖Subclass1 的_print 方法,但是Subclass1::print(); 语句会再次调用当前方法。如果注释掉 virtual void _print() = 0; 语句,则可以避免此问题。
为什么使用虚拟 _print 方法会阻止我调用重载的虚拟方法 Subclass1::_print 以及有什么解决方案让我不必不用虚拟方法?
【问题讨论】:
标签: c++ class oop multiple-inheritance