📜  C++中的对象切片(1)

📅  最后修改于: 2023-12-03 14:59:51.388000             🧑  作者: Mango

C++中的对象切片

对象切片(Object Slicing)是指将派生类对象赋值给基类对象时,派生类对象中的附加属性被丢弃,只保留了基类部分。这种情况下,派生类对象的大小可以大于基类对象。

示例

下面的示例中,定义了一个基类Animal和一个派生类DogDog继承自AnimalDog有一个属性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属性。

因此,在使用对象切片时应当注意,如果需要访问派生类特有的属性,应该使用指针或引用。