用派生类给基类对象赋值后,用基类对象怎么调用函数会有变化吗
时间: 2024-01-24 13:18:07 浏览: 23
如果派生类覆盖了基类的某个成员函数,那么用基类对象调用该成员函数时其行为会有变化,具体来说,会调用派生类中的该成员函数而不是基类中的。这是因为在运行时,对象的类型决定了调用哪个成员函数,而不是变量的类型。同时,如果该成员函数在派生类中被重载,那么调用该函数时也会根据参数的类型和数量选择具体的重载函数。
相关问题
如果公有派生,则可以用基类对象的地址赋值给派生类的指针
如果是公有派生,则可以将基类对象的地址赋值给派生类的指针。这是因为在公有派生中,派生类包含基类的所有成员,因此可以将基类指针隐式地转换为派生类指针。这种转换被称为向上转型。例如,假设有一个基类 `Animal` 和一个公有派生类 `Dog`,则可以将 `Animal` 对象的地址赋值给 `Dog` 指针,如下所示:
```
Animal* animal = new Dog();
```
这里,`new Dog()` 创建了一个 `Dog` 对象,并返回该对象的地址,该地址被隐式转换为 `Animal*` 类型,然后赋值给 `animal` 指针。在 `animal` 指针上调用的任何虚函数都将调用 `Dog` 类中的实现,因为 `Dog` 是 `Animal` 的公有派生类。
基类的对象可以赋值派生类的对象吗
可以,但是需要进行类型转换。派生类中的成员变量和成员函数在基类对象中是不可访问的,需要使用指向派生类对象的指针或引用才可以访问。例如:
```
class Base {};
class Derived : public Base {};
Derived d;
Base b = d; // 基类对象可以接收派生类对象(对象切割)
Base& b_ref = d; // 可以使用指向基类的引用引用派生类对象
Base* b_ptr = &d; // 可以使用基类指针指向派生类对象
Derived& d_ref = dynamic_cast<Derived&>(b_ref); // 强制类型转换,转换成子类引用
Derived* d_ptr = dynamic_cast<Derived*>(b_ptr); // 强制类型转换,转换成子类指针
```