C++ 虚函数和纯虚函数 virtual

文章通过实验展示了C++中虚函数和纯虚函数的区别。虚函数使得多态性成为可能,即使在基类中声明,也可以通过派生类的对象调用。纯虚函数则不允许类被实例化,常用于接口定义,派生类必须实现纯虚函数。实验表明,虚函数在类中占用一个指针大小的空间,而纯虚函数不占用空间,含有纯虚函数的类只能被继承。
摘要由CSDN通过智能技术生成

一、虚函数和纯虚函数

  • 含有纯虚函数的类不能被实例化;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 
派生类函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值