51基类与派生类的转换

简介: 51基类与派生类的转换

C++入门——60s从0到1

基类与派生类的转换

 

在C++中,基类和派生类之间可以进行类型转换。这种转换是通过动态类型转换(也称为多态)来实现的。

 

基类指针或引用与派生类对象的转换

 

如果一个基类指针或引用指向一个派生类对象,可以通过强制类型转换将其转换为派生类类型的指针或引用。

 

#include <iostream>
using namespace std;
 
class Base {
public:
    virtual void func() {
        cout << "Base::func()" << endl;
    }
};
 
class Derived : public Base {
public:
    void func() {
        cout << "Derived::func()" << endl;
    }
};
 
int main() {
    // 基类指针指向派生类对象
    Base* ptr = new Derived();
    ptr->func();  // 调用 Derived::func()
 
    // 将基类指针转换为派生类引用
    Derived& ref = *static_cast<Derived*>(ptr);
    ref.func();   // 调用 Derived::func()
 
    delete ptr;
    return 0;
}

在上面的例子中,我们创建了一个指向 `Derived` 对象的 `Base` 类型的指针 `ptr`。然后,我们通过强制类型转换将 `ptr` 从 `Base*` 转换为 `Derived*`,并将其赋值给 `Derived&` 类型的变量 `ref`。这样,我们就可以通过 `ref` 来调用 `Derived` 类型的成员函数 `func()`。

 

需要注意的是,如果基类没有虚函数,那么将无法通过基类指针或引用访问派生类的成员函数。因为编译器无法确定应该调用哪个函数,所以会引发编译错误。因此,在使用基类和派生类的转换时,通常需要将基类的虚函数声明为虚函数。

 

派生类对象与基类对象的转换

 

如果一个派生类对象可以被强制类型转换为一个基类类型的对象,那么这个派生类对象就可以被当作一个基类对象来处理。但是需要注意的是,这种强制类型转换可能会导致一些信息丢失。因为将一个派生类对象降级为一个基类对象后,它就失去了所有在派生类中新增的属性和行为。

#include <iostream>
using namespace std;
 
class Base {
public:
    virtual void func() {
        cout << "Base::func()" << endl;
    }
};
 
class Derived : public Base {
public:
    void func() {
        cout << "Derived::func()" << endl;
    }
};
 
int main() {
    // 将派生类对象降级为基类对象
    Base b = static_cast<Base&>(d);  // 强制类型转换为 Base&,而不是 Base*
    b.func();  // 调用 Base::func()
 
    return 0;
}

 

在上面的例子中,我们将一个 `Derived` 对象 `d` 通过强制类型转换降级为一个 `Base` 类型的对象 `b`。然后我们调用了 `b.func()`,由于 `Base` 的 `func()` 是虚函数,所以这里会调用 `Derived` 的 `func()` 函数。但是需要注意的是,此时我们已经将 `d` 的类型降为了 `Base`,所以它失去了所有在 `Derived` 中新增的属性和行为。

目录
相关文章
|
8月前
|
安全 Java 编译器
C++将派生类赋值给基类
在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: int a = 10.9; printf("%d\n", a); 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: float b = 10; printf("%f\n", b); 输出结果为 10.000000,编译器会自动添
105 0
|
9月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
49 0
|
10月前
|
C++
<c++> 类的继承 | 基类与派生类 | 构造函数与析构函数
<c++> 类的继承 | 基类与派生类 | 构造函数与析构函数
100 0
|
11月前
|
C++
基于C/C++将派生类赋值给基类的详细讲解
基于C/C++将派生类赋值给基类的详细讲解
113 0
基类与派生类对象的关系 派生类的构造函数
🐰 基类与派生类对象的关系 🐰派生类的构造函数
|
C++ Python
C++派生类对基类的访问详解
C++派生类对基类的访问详解
414 0
|
Java C++
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
162 0
|
缓存 Java 编译器
C++中为多态基类声明虚析构函数
C++中为多态基类声明虚析构函数
180 0
|
Java C++
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
2163 0