父类指针指向子类对象
时间: 2023-11-02 09:55:49 浏览: 68
当父类指针指向子类对象时,可以通过该指针访问子类对象中继承自父类的成员函数和成员变量。这是因为子类对象中包含了父类的成员,所以可以通过父类指针来访问这些成员。
例如,假设有一个父类Animal和一个子类Dog,其中Dog是Animal的派生类。我们可以创建一个Animal类型的指针,并将其指向一个Dog对象。如下所示:
```cpp
Animal* animalPtr = new Dog();
```
现在,我们可以使用animalPtr指针来调用Animal类中定义的成员函数,例如:
```cpp
animalPtr->eat(); // 调用Animal类中的eat()函数
```
同时,由于Dog是Animal的派生类,它可以添加自己的成员函数和成员变量。在这种情况下,使用指针访问这些特定于子类的成员时,需要进行类型转换。例如:
```cpp
Dog* dogPtr = dynamic_cast<Dog*>(animalPtr); // 将父类指针转换为指向子类的指针
dogPtr->bark(); // 调用Dog类中的bark()函数
```
需要注意的是,在使用指针访问派生类特定成员时,应确保父类指针指向的实际对象是派生类的对象,否则可能导致程序出错。
相关问题
析构函数不会被继承但用父类指针指向子类对象是,删除子对象为什么会掉父类的析构函数
当使用父类指针指向子类对象时,如果使用 delete 关键字删除这个指针,会自动调用父类的析构函数,但这并不是因为父类的析构函数被继承了,而是因为在这种情况下,delete 操作符会先调用子类的析构函数,然后再调用父类的析构函数。
这是因为在 C++ 中,派生类的析构函数会自动调用它的基类的析构函数,因此当子类对象被删除时,父类的析构函数也会被自动调用。但是,这并不是继承的结果,而是由于派生类在定义时自动包含了基类的成分,因此在销毁派生类对象时,需要同时销毁基类对象,而这就需要调用基类的析构函数。
因此,无论是使用父类指针指向子类对象,还是直接使用子类对象,删除时都会自动调用子类和父类的析构函数。
父类指针指向子类对象的虚函数表在编译时期与运行时期发生了哪些变化?
在编译时期,编译器会根据父类指针的声明类型来确定虚函数表的地址,并将其存储在父类指针中。这个地址指向的是父类的虚函数表,也就是说,编译时期确定的虚函数调用地址都是父类的虚函数地址。
在运行时期,当父类指针指向子类对象时,编译器会根据对象的实际类型(即子类类型)来重新计算虚函数表地址,并将其存储在父类指针中。这个地址指向的是子类的虚函数表,也就是说,运行时期确定的虚函数调用地址都是子类的虚函数地址。
因此,当使用父类指针调用虚函数时,会根据运行时期确定的虚函数表地址来调用相应的虚函数,从而实现了多态性。这也是C++中面向对象编程的一个重要特性。