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。
#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。