【C++例】虚函数—代码实例

1.虚函数的动态绑定

//虚函数(非静态的成员函数)
//动态绑定:只有通过基类的指针或引用调用虚函数时
#include<iostream>
using namespace std;
class Base1 {
public:
	virtual void display() const;
};
// 如果把某个函数指定为final,意味着该函数不能被覆盖
// class1 -> void f1(int) const final;
// class2(class1) -> void f1(int) const;//编译错误,不能被覆盖
void Base1::display() const {
	cout << "Base1" << endl;
}
// 用override关键字,说明一定来自基类的虚函数,否则报错
class Base2 :public Base1 {
public:
	void display() const override;
};
void Base2::display() const {
	cout << "Base2" << endl;
}

void fun(Base1* ptr) {
	ptr->display();
	// 如果只想调用基类Base1 ptr->Base1::display()

}

int main() {
	Base1 base1;
	Base2 base2;
	fun(&base1);
	fun(&base2);
	return 0;
}

// 为什么都是Base1类型指针,却可以访问Base2类成员?
// 根据赋值兼容规则,可以使用派生类的对象代替基类对象

2.虚析构函数

// 虚析构函数(有可能通过基类指针调用基类的析构函数时一定要声明为虚函数)
// 构造函数和析构函数都是特殊公有类函数,但是构造函数不支持多态,
// 而析构函数的多态与普通成员函数有所不同(函数名不同,因为要和类名相同)
#include<iostream>
using namespace std;
class Base {
public:
	virtual ~Base();
};
Base::~Base() {
	cout << "析构Base" << endl;
}
class Base2 :public Base {
public:
	Base2();
	~Base2();
private:
	int* p;
};
Base2::Base2() {
	p = new int(0);
}
Base2::~Base2() {
	cout << "析构Base2" << endl;
	delete p;
}
void fun(Base* b) {
	delete b;
}

int main() {
	// new是用于动态分配内存并返回指向该内存的指针的操作符
	Base* b = new Base2();
	fun(b);
	return 0;
}

3.纯虚函数与抽象类

// 纯虚函数(抽象函数)与抽象类
// 抽象类是带有纯虚函数的类
// 抽象类:在该基类没有定义具体的操作内容,为个派生类服务
// 抽象类不能被实例化,但是可以定义该类的指针或引用,通过指针和引用,访问派生类对象(多态性)
#include<iostream>
using namespace std;
class Base1 {	//抽象类
public:
	virtual void display() const = 0;	//纯虚函数
};

class Base2 :public Base1 {
public:
	void display() const;
};
// 派生类实现函数体(如果派生类没有实现纯虚函数体,那么这个派生类仍然是抽象类)
void Base2::display() const {
	cout << "Base2" << endl;
}
// 抽象类指针
void fun(Base1* ptr) {
	ptr->display();
}

int main() {
	Base2 base2;
	fun(&base2);
	return 0;
}

相关推荐

  1. C++函数代码实例

    2024-04-27 18:34:03       31 阅读
  2. C++函数

    2024-04-27 18:34:03       53 阅读
  3. c++函数

    2024-04-27 18:34:03       54 阅读
  4. C++ 函数

    2024-04-27 18:34:03       47 阅读
  5. c++ 纯函数

    2024-04-27 18:34:03       37 阅读
  6. C++:函数相关

    2024-04-27 18:34:03       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 18:34:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 18:34:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 18:34:03       82 阅读
  4. Python语言-面向对象

    2024-04-27 18:34:03       91 阅读

热门阅读

  1. jQuery

    jQuery

    2024-04-27 18:34:03      27 阅读
  2. c++ 计算引物退火温度

    2024-04-27 18:34:03       30 阅读
  3. 【48天笔试强训】day13

    2024-04-27 18:34:03       45 阅读
  4. Swift中TableView的使用

    2024-04-27 18:34:03       35 阅读
  5. 【uni】微信朋友圈图片九宫格样式

    2024-04-27 18:34:03       38 阅读
  6. 电脑安装双系统

    2024-04-27 18:34:03       39 阅读