派生类的指针赋值给基类之后,还可以再把基类的指针赋值给派生类吗
时间: 2023-11-04 11:09:53 浏览: 41
在C++中,派生类的指针赋值给基类之后,可以将基类的指针再赋值给派生类的指针,但需要使用强制类型转换。这个过程称为向下转型(downcasting)。需要注意的是,在进行向下转型时,必须确保基类指针指向的对象是派生类对象,否则会出现类型转换错误,导致程序运行错误或崩溃。
示例代码如下:
```cpp
class Base {
public:
virtual void foo() { cout << "Base::foo()" << endl; }
};
class Derived : public Base {
public:
void foo() { cout << "Derived::foo()" << endl; }
};
int main() {
Derived d;
Base* pb = &d; // 派生类指针赋值给基类指针
pb->foo(); // 调用的是 Derived::foo()
Derived* pd = dynamic_cast<Derived*>(pb); // 强制类型转换,将基类指针转换为派生类指针
pd->foo(); // 调用的是 Derived::foo()
return 0;
}
```
在上面的代码中,首先将派生类对象的地址赋值给基类指针 pb,然后通过强制类型转换将 pb 转换为 Derived* 类型的指针 pd,最后调用 pd 的 foo() 函数,输出 "Derived::foo()"。
相关问题
如果公有派生,则可以用基类对象的地址赋值给派生类的指针
如果是公有派生,则可以将基类对象的地址赋值给派生类的指针。这是因为在公有派生中,派生类包含基类的所有成员,因此可以将基类指针隐式地转换为派生类指针。这种转换被称为向上转型。例如,假设有一个基类 `Animal` 和一个公有派生类 `Dog`,则可以将 `Animal` 对象的地址赋值给 `Dog` 指针,如下所示:
```
Animal* animal = new Dog();
```
这里,`new Dog()` 创建了一个 `Dog` 对象,并返回该对象的地址,该地址被隐式转换为 `Animal*` 类型,然后赋值给 `animal` 指针。在 `animal` 指针上调用的任何虚函数都将调用 `Dog` 类中的实现,因为 `Dog` 是 `Animal` 的公有派生类。
这里为什么不是派生类对象对象的地址赋值给基类的指针
实际上,将派生类对象的地址赋值给基类指针也是可以的,这也是向上转型的一种形式。例如,假设有一个 `Dog` 对象,可以将其地址赋值给一个 `Animal` 指针,如下所示:
```
Dog* dog = new Dog();
Animal* animal = dog;
```
在这里,`dog` 指针指向一个 `Dog` 对象,然后将其地址赋值给 `animal` 指针,这是合法的,因为 `Dog` 是 `Animal` 的公有派生类。这种转换被称为向上转型,因为它将一个派生类指针转换为一个基类指针。
需要注意的是,如果在向上转型之后使用基类指针调用虚函数,将调用基类中的实现,而不是派生类中的实现。如果想要调用派生类中的实现,需要使用动态绑定技术,即将虚函数声明为虚函数,并在派生类中覆盖该函数。