📜  c++中的向上转换(1)

📅  最后修改于: 2023-12-03 15:29:54.354000             🧑  作者: Mango

C++中的向上转换(Upcasting)

在C++中,向上转换是指从派生类对象向基类对象的转换。这种转换是安全的,因为派生类对象包含了基类对象的所有数据和成员函数,并且它们的地址相同。因此,在对基类对象的方法和属性进行处理时,我们可以调用一个派生类对象的方法或属性,并且不会出现错误。

C++中的向上转换的语法如下所示:

Base* b = new Derived(); // 创建一个基类指针指向派生类对象

在上面的代码中,我们通过将指向派生类对象的指针赋值给一个基类指针来进行向上转换。

下面是一个完整的示例代码,展示了如何使用向上转换:

#include <iostream>

using namespace std;

class Animal {
public:
    virtual void speak() {
        cout << "I am an animal." << endl;
    }
};

class Dog : public Animal {
public:
    void speak() {
        cout << "I am a dog." << endl;
    }
};

int main() {
    // 创建一个派生类对象
    Dog* d = new Dog();

    // 将指向派生类对象的指针赋值给一个基类指针
    Animal* a = d;

    // 调用基类的方法
    a->speak();
    
    delete d;
    return 0;
}

在上面的代码中,我们创建了一个派生类Dog,它继承自基类Animal,并重写了Animal中的speak()方法。然后我们将指向派生类对象的指针d赋值给一个基类指针a,并通过a调用基类speak()方法。这里调用的是派生类的speak()方法,因为向上转换后,派生类对象包含了基类对象的所有数据和成员函数。输出结果为:

I am a dog.

在实际中,向上转换很常见。一个容器类如vector或其他类可以存储指向派生类对象的指针。当我们从容器中取出一个指针并处理它时,就需要使用向上转换。

总之,向上转换是C++中的一个重要概念,它可以让我们在处理基类对象时,使用派生类对象的方法和属性,并且可以避免错误的发生。