从抽象 class 继承以创建另一个抽象 class 时,我应该重新声明所有虚函数吗?
When inheriting from an abstract class to create another abstract class should I redeclare all virtual functions?
在使用 C++ 时,这更像是一个首选的风格问题。我正在寻找与此相关的首选标准。
假设我有一个接口 A
class AInterface {
public:
virtual ~AInterface() = default;
virtual void a() = 0;
};
然后我有另一个建立在 A 之上的接口 B
class BInterface : public AInterface{
public:
virtual void b() = 0;
virtual void otherb() = 0;
};
我的问题是我是否应该像这样在 B 中重新声明来自 AInterface 的所有虚函数?
class BInterface : public AInterface{
public:
virtual void a() = 0;
virtual void b() = 0;
virtual void otherb() = 0;
};
没有。你不必。
...你不应该,因为这是没有好处的不必要的重复。如果这样做,至少使用 override
关键字来避免声明中的不匹配。
假设您将基数更改为
class AInterface {
public:
virtual ~AInterface() = default;
virtual void a(int) = 0;
};
并且您忘记更新 BInterface
,然后哎呀,现在您在 BInterface
中有一个不想要的 void a()
。但是,如果您有 override
:
class BInterface : public AInterface{
public:
virtual void a() override = 0;
virtual void b() = 0;
virtual void otherb() = 0;
};
你会得到一个编译器错误,因为在上面的重构之后 void a()
没有从它的基类中覆盖一个方法。
如果您打算更改基础 class 的功能,则您只需重新 declare/define 后续 class 中的虚函数。也就是说,您给出的示例都是纯虚拟 classes,因此您将无法实例化它们。但总的来说,继承的要点之一是您不必不断地重新声明为派生的 classes.
做同样事情的函数
在使用 C++ 时,这更像是一个首选的风格问题。我正在寻找与此相关的首选标准。
假设我有一个接口 A
class AInterface {
public:
virtual ~AInterface() = default;
virtual void a() = 0;
};
然后我有另一个建立在 A 之上的接口 B
class BInterface : public AInterface{
public:
virtual void b() = 0;
virtual void otherb() = 0;
};
我的问题是我是否应该像这样在 B 中重新声明来自 AInterface 的所有虚函数?
class BInterface : public AInterface{
public:
virtual void a() = 0;
virtual void b() = 0;
virtual void otherb() = 0;
};
没有。你不必。
...你不应该,因为这是没有好处的不必要的重复。如果这样做,至少使用 override
关键字来避免声明中的不匹配。
假设您将基数更改为
class AInterface {
public:
virtual ~AInterface() = default;
virtual void a(int) = 0;
};
并且您忘记更新 BInterface
,然后哎呀,现在您在 BInterface
中有一个不想要的 void a()
。但是,如果您有 override
:
class BInterface : public AInterface{
public:
virtual void a() override = 0;
virtual void b() = 0;
virtual void otherb() = 0;
};
你会得到一个编译器错误,因为在上面的重构之后 void a()
没有从它的基类中覆盖一个方法。
如果您打算更改基础 class 的功能,则您只需重新 declare/define 后续 class 中的虚函数。也就是说,您给出的示例都是纯虚拟 classes,因此您将无法实例化它们。但总的来说,继承的要点之一是您不必不断地重新声明为派生的 classes.
做同样事情的函数