四时宝库

程序员的知识宝库

C++知识点 47:静态联编和动态联编

47.1 静态联编实例

#define _CRT_SECURE_NO_WARNINGS
#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.speak();
}
int main()
{
doSpeak(Cat()); // 结果:动物在说话
system("pause");
return EXIT_SUCCESS;
}
-----------------------------------------------------------
说明: Cat() 利用 Cat类 的默认构造函数,创建了一个匿名对象
函数传参过程: Animal & animal = Cat的匿名对象
我们注意到两个类的类型不同,但 Animal类 和 Cat类 有继承关系,编译器默认给做了强制类型转换
Animal & animal = (Animal)Cat(),因此可以传参成功
这是一种静态联编地址早绑定,在编译阶段就定好调用Animal类,运行时也无法改变
因此只能“ 动物在说话”

47.2 动态联编实例
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Animal
{
public:
virtual void speak() // 相比于静态联编 父类成员函数前加关键字 virtual 实现动态联编
{
cout << "动物在说话" << endl;
}
};
----------------------------------------------------------
class Cat :public Animal
{
public:
virtual void speak() // 子类函数前 virtual 可加可不加 建议加 体现多态编写
{
cout << "小猫在说话" << endl;
}
};
--------------------------------------------------------
void doSpeak(Animal & animal)
{
animal.speak();
}
int main()
{
cout << sizeof(Animal) << endl; // 结果: 4
// 加 virtual 意味着Animal不是一个空类,而是内部维护了一个vfptr(虚函数表指针)
doSpeak(Cat()); // 结果:小猫在说话
doSpeak(Animal()); // 结果:动物在说话
system("pause");
return EXIT_SUCCESS;
}
动态联编 -- 地址晚绑定(运行时才决定函数调用的地址)
传入Cat类对象,就执行Cat类中speak函数
传入Animal类对象,就执行Animal类中speak函数
静态联编:即使传入Cat类对象,也执行Animal类中speak函数


发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接