[英]How can I override a purely virtual method, yet still force child classes to implement the same method?
I have an abstract base class with one purely virtual method:我有一个带有一个纯虚方法的抽象基类:
class Base
{
public:
virtual void update() = 0;
};
Is there any way I could create a class that inherits from Base
, overrides the update
method, but still forces its children to implement an update
method?有什么方法可以创建一个继承自
Base
的类,覆盖update
方法,但仍然强制其子级实现update
方法? Like this:像这样:
class Base2 : public Base
{
public:
void update() override
{
if(bSomeCondition)
{
update(); //Calls child's update method
}
}
virtual void update() = 0; // Obviously not like this
};
I know I could create two new purely virtual methods with slightly different names in Base2
, and just override those in child classes, but I would really like to keep these method names if that would be possible.我知道我可以在
Base2
创建两个名称略有不同的新纯虚拟方法,并只覆盖子类中的那些,但如果可能的话,我真的很想保留这些方法名称。
I'm guessing this isn't possible?我猜这是不可能的?
You can provide a definition for a pure virtual function, just not inline.您可以为纯虚函数提供定义,而不是内联。
class Base2 : public Base
{
public:
void update() override = 0;
};
void Base2::update() // Base2 is abstract regardless of this
{
if(bSomeCondition)
{
update();
}
}
However, this is not useful with the current implementation of Base2::update
.但是,这对
Base2::update
的当前实现没有用。 Because a child class must override it anyway, Base2
version will not be called unless used explicitly:因为无论如何子类都必须覆盖它,除非明确使用,否则不会调用
Base2
版本:
class Child: public Base2
{
public:
void update() override
{
Base2::update(); //infinite recursion with such implementation
}
};
// the other way would be to require calling it explicitly at call site
std::unique_ptr<Base2> ptr = std::make_unique<Child>();
ptr->Base2::update();
What you should do is to provide an implementation and another pure virtual function (possibly protected
) to be called:您应该做的是提供一个实现和另一个要调用的纯虚函数(可能是
protected
):
class Base2 : public Base
{
public:
void update() override;
protected:
virtual void doStuff() = 0;
};
void Base2::update()
{
if(bSomeCondition)
{
doStuff(); //Calls child's update method
}
}
不,这是不可能的,在我看来它会非常难以辨认。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.