基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义

Can a base class declare a virtual method but not define it? Still defined in derived classes

本文关键字:定义 派生 虚拟 声明 方法 基类      更新时间:2023-10-16
#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 阅读有关纯虚函数及其效果的更多信息。