📅  最后修改于: 2023-12-03 14:59:51.388000             🧑  作者: Mango
对象切片(Object Slicing)是指将派生类对象赋值给基类对象时,派生类对象中的附加属性被丢弃,只保留了基类部分。这种情况下,派生类对象的大小可以大于基类对象。
下面的示例中,定义了一个基类Animal
和一个派生类Dog
,Dog
继承自Animal
。Dog
有一个属性breed
表示狗的品种。
#include <iostream>
#include <string>
class Animal {
public:
virtual void speak() {
std::cout << "This is an animal." << std::endl;
}
};
class Dog : public Animal {
public:
std::string breed;
Dog(std::string breed) : breed(breed) {}
void speak() {
std::cout << "This is a dog of breed " << breed << "." << std::endl;
}
};
现在我们定义了一个函数printAnimal
,参数为Animal
类型的引用。然后分别通过Animal
对象和Dog
对象来调用该函数。
void printAnimal(Animal& animal) {
animal.speak();
}
int main() {
Animal animal;
Dog dog("Golden Retriever");
printAnimal(animal);
printAnimal(dog);
return 0;
}
输出结果为:
This is an animal.
This is a dog of breed Golden Retriever.
我们可以看到,当我们用Dog
对象来调用printAnimal
函数时,输出的内容比使用Animal
对象多了一个品种。
如果将Dog
对象赋值给Animal
对象,那么就会发生对象切片。下面的代码演示了这种情况。
Dog dog("Golden Retriever");
Animal animal = dog;
printAnimal(animal);
输出结果为:
This is an animal.
可以看到,当Dog
对象被赋值给Animal
对象时,对象切片发生了。我们只能访问Dog
继承自Animal
的部分,而无法访问Dog
特有的breed
属性。
因此,在使用对象切片时应当注意,如果需要访问派生类特有的属性,应该使用指针或引用。