📅  最后修改于: 2023-12-03 15:14:03.678000             🧑  作者: Mango
在C++中,早期绑定(Early Binding)和晚期绑定(Late Binding)是面向对象编程中的两个重要概念。它们与多态性(Polymorphism)密切相关,对程序员来说非常重要。
早期绑定指的是在编译时确定函数的调用地址。也就是说,在编译阶段,编译器将根据函数的静态类型来决定调用哪个函数。这种绑定方式也被称为静态绑定。
以下是一个简单的例子,演示早期绑定的用法:
#include <iostream>
class Animal {
public:
virtual void speak() {
std::cout << "Animal speaks!" << std::endl;
}
};
class Cat : public Animal {
public:
void speak() override {
std::cout << "Cat says Meow!" << std::endl;
}
};
class Dog : public Animal {
public:
void speak() override {
std::cout << "Dog says Woof!" << std::endl;
}
};
int main() {
Animal* animal = new Animal();
Animal* cat = new Cat();
Animal* dog = new Dog();
animal->speak(); // Output: Animal speaks!
cat->speak(); // Output: Cat says Meow!
dog->speak(); // Output: Dog says Woof!
delete animal;
delete cat;
delete dog;
return 0;
}
在上述代码中,speak()
函数是虚函数,通过使用 virtual
关键字进行声明。在运行时,根据对象的实际类型确定调用的函数。
晚期绑定指的是在运行时确定函数的调用地址。也就是说,在编译阶段无法确定函数的实际地址,而是在运行时根据对象的动态类型来确定。这种绑定方式也被称为动态绑定或运行时绑定。
以下是一个使用晚期绑定的示例:
#include <iostream>
class Animal {
public:
virtual void speak() {
std::cout << "Animal speaks!" << std::endl;
}
};
class Cat : public Animal {
public:
void speak() override {
std::cout << "Cat says Meow!" << std::endl;
}
};
class Dog : public Animal {
public:
void speak() override {
std::cout << "Dog says Woof!" << std::endl;
}
};
int main() {
Animal* animals[3];
animals[0] = new Animal();
animals[1] = new Cat();
animals[2] = new Dog();
for (int i = 0; i < 3; i++) {
animals[i]->speak();
}
delete animals[0];
delete animals[1];
delete animals[2];
return 0;
}
在上述代码中,我们使用了一个Animal
类型的指针数组 animals
来存储不同类型的对象。在循环中,通过调用 speak()
函数来实现多态性。