base class 可以声明一个虚方法但不定义它吗?仍然在派生 classes 中定义

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 中找到对定义的引用,但如果预期行为是派生的 class 为什么需要在 A 中定义它] 将始终覆盖基础 class,换句话说,A::foo() 永远不会被调用?

更明确地说,有没有办法在基 class 中声明虚方法,但只在派生 class 中定义它?考虑基本方法调用永远不会显式发生。

您要查找的内容称为 "pure virtual function",您在 class 定义中使用 = 0:

声明了它
class A {
    protected:
        char t;
    public:
        virtual ~A();
        virtual std::vector<M> foo(unsigned int) = 0; // <--
        char getChar();
};

您可以阅读有关纯虚函数及其效果的更多信息at cppreference.com