基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
Can a base class declare a virtual method but not define it? Still defined in derived classes
#include <vector>
class M {
public:
M(unsigned int);
unsigned int n;
};
M::M(unsigned int i) { n = i; }
class A {
protected:
char t;
public:
virtual ~A();
virtual std::vector<M> foo(unsigned int);
char getChar();
};
A::~A(){}
std::vector<M> A::foo(unsigned int u) {
std::vector<M> v;
return v;
}
char A::getChar() { return t; }
class B : public A {
public:
B();
std::vector<M> foo(unsigned int);
};
B::B() { t = 'b'; }
std::vector<M> B::foo(unsigned int c) {
std::vector<M> v;
for (unsigned int i = 0; i < c; i++) {
v.push_back(i);
}
return v;
}
int main() {}
在上面的代码中,我收到A::foo()
unused parameter 'u'
警告。但是,完全删除该函数时,我收到一个错误,指出B
中存在对A::foo()
的未定义引用。B
正在实现虚拟方法,并且无法在A
中找到对定义的引用,但是如果预期的行为是派生类将始终覆盖基类,换句话说,A::foo()
永远不会被调用,为什么需要在A
中定义它?
为了更具声明性,有没有办法在基类中声明虚拟方法,但只在派生类中定义它?考虑基方法调用永远不会显式发生。
你要找的被称为"纯虚函数",你在类定义中声明它,= 0
:
class A {
protected:
char t;
public:
virtual ~A();
virtual std::vector<M> foo(unsigned int) = 0; // <--
char getChar();
};
您可以在 cppreference.com 阅读有关纯虚函数及其效果的更多信息。
相关文章:
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 有没有办法将C++结构/类中的所有定义都纳入范围而不从中派生?
- 如何使虚函数接受仅在派生类中定义的数据类型?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 错误:基类在从基类父派生类 Son 时未定义
- 自定义派生的 std::exception 类的 'what' 函数返回神秘的废话
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 如何在C 中创建Logic_error的自定义派生类
- 如何在C 中定义派生类
- 如何在升压单位中正确定义派生单位
- 尝试定义派生自抽象类的类类型的对象时出错
- 重新定义派生类中的基类方法
- 如何定义派生模板类的函数
- 如何通过定义派生类的构造函数来实例化两个基类的私有数据成员
- 定义派生类时,为什么基类被标记为"public?"
- 重新定义派生类的继承内部函数以对基类产生影响
- 如何定义派生类的非成员构造函数(在类头文件中)