C++ 中的继承机制允许子类从其父类中继承数据和方法。在使用继承时,我们需要了解基类指针和子类指针的概念,以及它们之间的相互赋值的方法。
基类指针和子类指针的定义
- 基类指针:指向基类对象的指针,可以指向基类对象本身,也可以指向其派生类的对象。例如:
```c++
class Base {
public:
virtual void print() {
cout << "This is Base class" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "This is Derived class" << endl;
}
};
Base *pBase; // 声明一个基类指针
pBase = new Base();
pBase->print(); // 输出 This is Base class
pBase = new Derived();
pBase->print(); // 输出 This is Derived class
```
- 子类指针:指向子类对象的指针,只能指向子类对象本身。例如:
```c++
Derived *pDerived; // 声明一个子类指针
pDerived = new Derived();
pDerived->print(); // 输出 This is Derived class
// 子类指针不能指向基类对象
// pDerived = new Base(); // 编译错误
```
基类指针和子类指针的相互赋值
基类指针可以指向其派生类的对象,但是子类指针不能指向其基类对象。对于基类指针和子类指针的相互赋值,需要注意以下几点:
- 子类指针可以直接赋值给基类指针。例如:
c++
Derived *pDerived = new Derived();
Base *pBase;
pBase = pDerived;
- 基类指针赋值给子类指针时,需要使用类型转换。例如:
c++
Base *pBase = new Derived();
Derived *pDerived;
pDerived = dynamic_cast<Derived*>(pBase);
if (pDerived != NULL) {
pDerived->print();
}
在将基类指针赋值给子类指针时,需要使用 dynamic_cast 运算符进行类型转换。如果转换成功,pDerived 就可以调用子类的成员函数。
- 如果基类指针指向的是基类对象而非其派生类对象,将其赋值给子类指针会导致未定义行为。
示例1:
Base *pBase = new Base();
Derived *pDerived = dynamic_cast<Derived*>(pBase);
if (pDerived != NULL) {
pDerived->print();
}
对于上述代码,pBase 指向 Base 类的一个对象。将其赋值给 pDerived 后,由于 pBase 并非 Derived 类的对象,转换会失败,此时 pDerived 的值为 NULL,调用其成员函数会出现无法预料的错误。
示例2:
Base *pBase = new Derived();
Derived *pDerived = dynamic_cast<Derived*>(pBase);
if (pDerived != NULL) {
pDerived->print();
}
对于上述代码,pBase 指向 Derived 类的一个对象。将其赋值给 pDerived 后,转换成功,可以调用其成员函数。
综上所述,基类指针和子类指针的相互转换需要注意类型转换的问题,并且需要确保转换后的指针指向的对象类型是正确的。在实际编程中,需要仔细考虑继承关系,避免出现未定义行为。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈C++ 基类指针和子类指针的相互赋值 - Python技术站