C++程序的输出| 8套
预测以下 C++ 程序的输出。
问题 1
#include
using namespace std;
class Test1
{
int x;
public:
void show() { }
};
class Test2
{
int x;
public:
virtual void show() { }
};
int main(void)
{
cout<
输出:
4
8
Test1 和 Test2 之间只有一个区别。 show() 在 Test1 中是非虚拟的,但在 Test2 中是虚拟的。当我们将函数设为虚拟时,编译器会添加一个额外的指针 vptr 指向该类的对象。编译器这样做是为了实现运行时的多态性(有关更多详细信息,请参阅 Thinking in C++ book 的第 15 章)。额外的指针 vptr 增加了对象的大小,这就是为什么我们得到 8 作为 Test2 的大小。
问题2
#include
using namespace std;
class P
{
public:
virtual void show() = 0;
};
class Q : public P {
int x;
};
int main(void)
{
Q q;
return 0;
}
输出:编译器错误
我们收到错误是因为我们无法创建抽象类的对象。 P 是一个抽象类,因为它有一个纯虚方法。类 Q 也变得抽象,因为它派生自 P 并且它没有实现 show()。