c++在具体类中强制方法重写
C++ Forcing Method Override In Concrete Class
是否有一种方法在c++中编写一个具体类,当另一个类从它派生时,有一个必须被重写的方法。抽象类允许强制派生类创建任何抽象方法的具体版本,但我想要的是一个基类,它可以强制这样做,但也可以在自己的权利中使用。我知道抽象方法也可以指定默认功能,但这仍然是一个不能实例化的抽象类。
我也看了模板方法模式,但这似乎不是我正在寻找的。
我将假设您正在寻找执行此条件的编译时(感谢@Chad指出这一点)
据我所知,c++中没有直接的语言机制。我的意思是,没有一个保留关键字放在你的方法声明前面来实现你想要的目标。
我认为你所说的指向了你们软件中的一个设计问题。假设您想强制foo()方法由以下代码片段
中的所有继承类重新实现class BaseButConcrete
{
... //Common stuff
... //
virtual void foo()
{ /*implementation that you do not want to be inherited, but will be...*/ }
}
class DerivedOtherConcrete : public BaseButConcrete
{
void foo()
{ /*different implementation,
but no obligation from compiler point of view*/ }
}
我看不出为什么所有常见的东西不能在抽象基类中移动的好的设计理由。从你所描述的,你不想继承foo在派生的实现,所以不要继承那部分!因此,非常经典的设计应该做到这一点:
class AbstractBase
{
... //Common stuff has moved here
... //
virtual void foo() =0;
}
class NotAnymoreBaseButStillConcrete : public AbstractBase
{
void foo()
{ /*implementation that should not be inherited,
and that will not by design*/ }
}
class DerivedOtherConcrete : public AbstractBase
{
void foo()
{ /*different implementation,
now mandatory compiler-wise for the class to be concrete*/ }
}
这样,公共的东西仍然在你所有的派生类之间共享,你保留你不想继承的东西(即foo实现)在不同继承路径的类中分开。
不,不可能。如果你想强制(在编译时)一个派生类定义一个虚函数,那么它的基类需要是抽象的,或者换句话说,基类需要有一个纯虚函数。抽象类(带有纯虚函数)不能是具体的,也就是说,你不能实例化它。
一种选择是将类的所有实现放入抽象超类中,并从该超类继承。
- 将所有具体类T的实现移到抽象类s中。
- 在S中,让必须被重写的方法成为一个纯虚函数——并提供它的定义。
- T子类S.
- 在T中,重写必须被重写的函数,并调用S实现。
- 将T子类改为s子类
- 防止t子类化
比起定义中间类,我发现对多重继承的利用更加直观和干净。如果我们的派生类也继承了一个抽象类,该抽象类声明了一个纯虚方法,其名称与我们想要强制重写的方法相同,则编译器将不允许实例化派生类型的对象,除非该方法在派生类中实际被重写。
#include <iostream>
struct Base{
virtual void print() {std::cout << "Base" << std::endl; }
};
struct RequireOverride {
virtual void print() = 0;
};
struct D1: Base, RequireOverride {
virtual void print() {std::cout << "D1" << std::endl; }
};
struct D2: Base, RequireOverride {
// no override of function print() results in a compilation error
// when trying to instantiate D2
};
int main() {
D1 d1;
d1.print(); //ok
//D2 d2; // ERROR: cannot declare variable 'd2' to be of abstract type 'D2'
// because the following virtual functions are pure within 'D2':
// virtual void RequireOverride::print()
return 0;
}
如果你有多个方法,你想要强制覆盖的存在,那么你可以把它们都放在RequireOverride
中,或者定义更多的结构来多重继承,比如RequireOverrideMethod1
, RequireOverrideMethod2
,根据上下文。
正如其他人所提到的,你可以"修复";通过将当前的具体类拆分为抽象类和具体类,可以实现一级派生。
这种方法的常见概括是必须使用类模板从每个抽象类创建具体类。例如,它可以提供一个clone
方法。或者,在微软的ATL中,它提供IUnknown
接口实现。
clone
。一般来说,你不能强迫别人的代码是正确的,你只能在这个方向上帮助它。
顺便说一下,如果你能更具体地说明你的问题,那么可能会有比这种笼统的愿望更好的答案。然而,通过概括你的问题,你概括了答案。
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 如何强制从重写方法调用重写的方法基方法?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 在 C++ 中使用模板方法重写类方法
- 检查子类是否执行了方法重写
- C++方法重写和重载(编译器级别)
- 用模板方法重写虚拟方法
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分
- C++ - 方法重写未按预期表示
- 使用两种方法重写<<运算符
- C++阻止方法重写
- C++方法重写
- c++在具体类中强制方法重写
- 方法重载和方法重写的性能问题
- C++中的方法重写是否总是在派生类的标头中完成?
- 是否有更好的方法重写此代码片段
- 为什么静态方法重写基类非静态方法
- 方法重写