C++ 多态

偷偷拿来记录一下萌新的cs路——day 39 C++多态语法和原理

静态多态:函数重载、运算符重载,复用函数名。函数地址早绑定,编译阶段确定。

动态多态:派生类、虚函数。函数地址晚绑定,运行阶段确定。

#include<iostream>
using namespace std;

class Animal {
public:
	void speak() {
		cout << "动物说话" << endl;
	}
};

class Cat : public Animal {
public:
	void speak() {
		cout << "猫猫说话" << endl;
	}
};

// 执行说话的函数
void doSpeak(Animal& animal) {  // Animal & animal = cat;
	animal.speak();
}

void test01() {
	Cat cat;
	doSpeak(cat);
}

int main() {
	test01();
	return 0;
}

运行结果

由于函数地址早绑定,读取了animal 的地址,所以结果为动物说话。若要得到猫猫说话,需将Animal 类的speak 函数变为虚函数,实现函数地址晚绑定。

#include<iostream>
using namespace std;

class Animal {
public:
	// 虚函数
	virtual void speak() {
		cout << "动物说话" << endl;
	}
};

class Cat : public Animal {
public:
	void speak() {
		cout << "猫猫说话" << endl;
	}
};

class Dog :public Animal {
public:
	void speak() {
		cout << "狗勾说话" << endl;
	}
};

void doSpeak(Animal& animal) {  // Animal & animal = cat;
	animal.speak();
}

void test01() {
	Cat cat;
	doSpeak(cat);

	Dog dog;
	doSpeak(dog);
}

int main() {
	test01();
	return 0;
}

运行结果

可见动态多态的条件

1. 继承关系;

2. 子类重写父类中虚函数;

3. 父类指针or引用 指向子类对象。

#include<iostream>
using namespace std;

class Animal {
public:
	virtual void speak() {
		cout << "动物说话" << endl;
	}
};

class Cat : public Animal {
public:
	void speak() {
		cout << "猫猫说话" << endl;
	}
};

class Dog :public Animal {
public:
	void speak() {
		cout << "狗勾说话" << endl;
	}
};

void doSpeak(Animal& animal) {  // Animal & animal = cat;
	animal.speak();
}

void test01() {
	Cat cat;
	doSpeak(cat);

	Dog dog;
	doSpeak(dog);
}

void test02() {
	cout << "size of Animal: " << sizeof(Animal) << endl;
}

int main() {
	test02();
	return 0;
}

运行结果 

查看继承模型可知基类的vfptr(虚函数指针) 指向了继承类。

有纯虚函数的类称为抽象类。特点:

1. 不能实例化对象;

2. 子类必须重写父类中纯虚函数,否则子类也为抽象类。

#include<iostream>
using namespace std;

class Base { 
public:
	virtual void func() = 0;  // 纯虚函数
};

class Son :public Base {
public:
	void func() {
		cout << "func函数调用" << endl;
	}
};

void test01() {
	Base* base = new Son;
	base->func();
}

int main() {
	test01();
	return 0;
}

运行结果

 

学了更多知识还会回来更新的,有误之处请大佬指正,非常感谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值