一、虚函数和纯虚函数
- 含有纯虚函数的类不能被实例化;virtual void func2() = 0;
- 含有虚函数的类可以被实例化
#include <iostream>
using namespace std;
class A {
public:
virtual void func2() = 0; //纯虚函数
};
// 若实例化 A a; 编译阶段就会出错
实验一
#include <iostream>
using namespace std;
class A {
public:
int i; //四个字节
virtual void func1() {
cout << "这是虚函数" << endl;
};
virtual void func2() = 0;
};
class B:public A
{
public:
int b;
};
int main()
{
int len = sizeof(A);
cout << "对象a的大小为: " << len << endl;
// a.func1();
}
输出
[huang@SH-NB-0313 ~/temp]$ gcc new_day.cpp -lstdc++
[huang@SH-NB-0313 ~/temp]$ ./a.out
对象a的大小为: 16
总结:1、虚函数占类空间;2、纯虚函数不占类空间
实验二
#include <iostream>
using namespace std;
class A {
public:
int i; //四个字节
virtual void func1() {
cout << "这是虚函数" << endl;
};
};
class B:public A
{
public:
int b;
};
int main()
{
A a;
int len = sizeof(A);
cout << "对象a的大小为: " << len << endl;
a.func1();
}
输出
[huang@SH-NB-0313 ~/temp]$ gcc new_day.cpp -lstdc++
[huang@SH-NB-0313 ~/temp]$ ./a.out
对象a的大小为: 16
这是虚函数
总结:1、虚函数可以被执行;2、含有虚函数的类可以被实例化;3、含有纯虚函数的类不能被实例化,只能被继承,且子类必须实现
实验三
#include <iostream>
using namespace std;
class A {
public:
int a; //四个字节
int b;
int c;
virtual void func1(){};
};
class B:public A
{
public:
int d;
int m;
};
int main()
{
cout << "类A的大小为: " << sizeof(A) << endl;
cout << "类B的大小为: " << sizeof(B) << endl;
A a;
B b;
cout << "对象a的大小为: " << sizeof(a) << endl;
cout << "对象b的大小为: " << sizeof(b) << endl;
// B b;
// int len = sizeof(b);
// cout << "对象a的大小为: " << len << endl;
// b.func1();
}
输出
[huang@SH-NB-0313 ~/temp]$ gcc new_day.cpp -lstdc++
[huang@SH-NB-0313 ~/temp]$ ./a.out
类A的大小为: 24
类B的大小为: 32
对象a的大小为: 24
对象b的大小为: 32
结论:1、系统是64位,才用8字节对齐;2、virtual void func1(){} 占一个指针字节
实验四
#include <iostream>
using namespace std;
class A {
public:
virtual void func1(){
cout << "基类虚函数" << endl;
};
};
class B:public A
{
public:
void func1(){
cout << "派生类函数" << endl;
}
};
int main()
{
A*p2 = new B; //正确多态使用方法
p2 ->func1();
}
输出
[huang@SH-NB-0313 ~/temp]$ gcc new_day.cpp -lstdc++
[huang@SH-NB-0313 ~/temp]$ ./a.out
派生类函数