《C++ Primer》(第五版)第541页中说:值得注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部。
但是当我们做如下实验的时候却会发生报错:
#include <iostream>
class A {
public:
virtual void printClassName() { std::cout << "This is class A" << std::endl; }
};
class B : public A {
public:
void printClassName() = 0;
};
void B::printClassName() { std::cout << "This is class B" << std::endl; }
class C : public B {
public:
void printClassName() override { std::cout << "This is class C" << std::endl; }
};
// void C::printClassName()
int main(int argc, char const *argv[])
{
A a;
B b;
C c;
a.printClassName();
b.printClassName();
c.printClassName();
return 0;
}
错误信息如下所示:
a.cpp: In function 'int main(int, const char**)':
a.cpp:25:7: error: cannot declare variable 'b' to be of abstract type 'B'
B b;
^
a.cpp:8:7: note: because the following virtual functions are pure within 'B':
class B : public A {
^
a.cpp:13:6: note: 'virtual void B::printClassName()'
void B::printClassName() { std::cout << "This is class B" << std::endl; }
^
也就是说对于声明了纯虚函数的class B本身来说即使定义了纯虚函数的函数体也是没有意义的,但这显然和书中所讲不符,请问这里面有什么问题吗?还是我的理解出现了问题,谢谢大佬~
首先,拥有纯虚函数的类,是一个抽象类,不可以实例化对象,所以 B b 的时候会报错。
1和3 报错就是这个原因。
第二个报错的话我觉得会不会是抽象类不能继承,但是可以被继承