为什么需要重新声明接口
Why does an interface needs to be redeclared?
我有一个抽象的基类,想在派生类中实现一个函数。为什么我必须再次在派生类中声明函数?
class base {
public:
virtual int foo(int) const = 0;
};
class derived : public base {
public:
int foo(int) const; // Why is this required?
};
int derived::foo(int val) const { return 2*val; }
考虑到派生类定义可能位于标头中,而其实现可能位于源文件中。 标头通常包含在多个位置("翻译单元")中,每个位置都将独立编译。 如果您没有声明重写,那么编译器就不会知道任何其他翻译单元中的内容。
在基类中使函数纯virtual
的目的是派生类必须重写它并提供自己的实现。
请注意,类中存在纯虚函数会使该类成为抽象类。简单来说,该类充当创建更具体类的接口。不能创建抽象类的对象。
则派生类仅包含继承的基类纯虚函数,并且它本身也充当抽象类。一旦派生类是抽象的,就无法实例化它。
因此,为了实例化派生类,它需要覆盖并因此声明纯虚函数。
你可能认为编译器可以推断出你必须提供derived::foo()
的实现,derived
但这也可能是一个抽象类(事实上,如果你不用derived
声明foo()
,这就是你会得到的)
It is to override the abstraction of the base class
.
如果不重新声明它,则派生类也是一个抽象类。如果你这样做,那么你现在有一个非抽象的基类型。
因为层次结构可以有更多的层。
struct Base {
virtual void foo() const = 0;
virtual void bar() const = 0;
};
struct SuperBase: Base {
virtual void bar() const override;
};
struct Concrete: SuperBase {
virtual void foo() const override;
};
在这里,SuperBase
没有提供foo
的实现,这需要以某种方式指出。
虽然你不能用纯虚函数实例化一个类,但你仍然可以创建一个这样的类:
class base {
public:
virtual int foo(int) const = 0;
};
class derived : public base {
public:
};
class very_derived : public derived {
public:
virtual int foo(int) const { return 2; }
};
派生类仍然是一个抽象类,它不能被实例化,因为它不会覆盖foo
。在实例化类之前,您需要声明 foo 的非纯虚拟版本,即使您没有立即定义 foo。
相关文章:
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 如何在C++中用属性声明COM接口
- 使用具有新信号槽语法的Qt插件系统在接口类中声明信号
- 静态声明专用类的接口指针数组
- 使用基类指针 - cpp 的适当声明设计接口
- 避免对实现接口的类使用多个几乎相同的声明
- 声明仅在C 中使用读取属性的接口
- 接口定义中的方法声明
- 错误"未在作用域中声明",但带有接口
- 在主应用程序中声明的 dll 中实现接口 - C++
- 我们可以通过在C++中的类中使用关键字“abstract”使所有方法抽象来声明接口类吗
- C ++接口告诉我我的论点尚未声明
- 为什么需要重新声明接口
- 在 C++ 中声明的 COM 接口
- 用C++03的方法简化接口声明
- 声明没有头文件的COM接口指针
- 连接接口中声明的QT信号
- 类树中间的接口声明 (C++)
- 在c++ 11中声明接口的最佳方式
- 声明一个接口,其方法具有实现该接口的类的参数