面试题答案
一键面试- 多态的概念及实现原理:
- 在C++中,多态通过虚函数和指针或引用实现。当使用基类指针或引用指向派生类对象时,根据对象的实际类型(运行时类型)来决定调用哪个类的虚函数,而不是根据指针或引用的静态类型(编译时类型)。这使得代码可以根据对象的实际类型来执行不同的行为,实现多态性。
- 简单的基类和派生类结构示例:
#include <iostream>
// 基类
class Animal {
public:
// 虚函数
virtual void speak() const {
std::cout << "Animal makes a sound." << std::endl;
}
};
// 派生类
class Dog : public Animal {
public:
// 重写基类的虚函数
void speak() const override {
std::cout << "Dog barks." << std::endl;
}
};
// 派生类
class Cat : public Animal {
public:
// 重写基类的虚函数
void speak() const override {
std::cout << "Cat meows." << std::endl;
}
};
int main() {
// 基类指针
Animal* animalPtr;
// 创建Dog对象并让基类指针指向它
Dog dog;
animalPtr = &dog;
animalPtr->speak();
// 创建Cat对象并让基类指针指向它
Cat cat;
animalPtr = &cat;
animalPtr->speak();
return 0;
}
在上述代码中:
Animal
类是基类,其中的speak
函数被声明为虚函数。Dog
和Cat
类是从Animal
类派生而来,并且重写了speak
函数。- 在
main
函数中,通过Animal
类型的指针animalPtr
,分别指向Dog
和Cat
对象,并调用speak
函数。由于speak
是虚函数,实际调用的是对象实际类型(Dog
或Cat
)的speak
函数,从而实现了多态。同样,使用基类引用也可以达到类似的效果,例如:
int main() {
Dog dog;
Animal& animalRef = dog;
animalRef.speak();
Cat cat;
animalRef = cat;
animalRef.speak();
return 0;
}
这里通过Animal
类型的引用animalRef
,根据绑定对象的实际类型(Dog
或Cat
)调用相应的speak
函数,也体现了多态性。