要实现基类指针和子类指针相互赋值,需要使用向上转型和向下转型实现。
向上转型是将子类的指针转换为基类的指针,可以使用static_cast操作符或者在函数中使用传递引用或指针的方式进行转型,其格式如下所示:
基类指针名 = static_cast<基类*>(子类指针名);
或者
void 函数名(基类& 或指针名,子类& 或指针名)
{
基类指针名 = &子类名;
}
而向下转型是将基类指针转换为子类指针,需要使用dynamic_cast操作符进行指针转型,其格式如下所示:
子类指针名 = dynamic_cast<子类*>(基类指针名);
接下来,两条示例说明:
- 以动物为基类,狗和猫为子类的示例
class Animal {
public:
virtual void sound() { cout << "ANIMAL SOUND" << endl; }
virtual ~Animal() {}
};
class Dog : public Animal {
public:
void sound() { cout << "WOOF" << endl; }
};
class Cat : public Animal {
public:
void sound() { cout << "MEOW" << endl; }
};
int main() {
Animal* a = new Animal();
Dog* d = new Dog();
Cat* c = new Cat();
//向上转型,将指向子类对象的指针转换为指向基类对象的指针
Animal* animalPtr = static_cast<Animal*>(d);
//向下转型,将指向基类对象的指针转换为指向子类对象的指针
Dog* dogPtr = dynamic_cast<Dog*>(animalPtr);
//输出结果
animalPtr->sound(); //WOOF
dogPtr->sound(); //WOOF
//将指向子类对象的指针转换为指向基类对象的指针
animalPtr = c;
//向下转型,将指向基类对象的指针转换为指向子类对象的指针
Cat* catPtr = dynamic_cast<Cat*>(animalPtr);
//输出结果
animalPtr->sound(); //MEOW
catPtr->sound(); //MEOW
//释放动态分配的内存
delete a;
delete d;
delete c;
return 0;
}
在这个示例中,我们首先创建了一个基类对象和两个子类对象(狗和猫)。然后使用向上转型和向下转型实现了基类指针和子类指针之间的相互转换。最后,我们调用每个指针的sound()函数,输出其特有的声音。
- 以图形为基类,圆形和矩形为子类的示例
class Shape {
public:
virtual float area() { return 0; }
virtual ~Shape() {}
};
class Circle : public Shape {
private:
float r;
public:
Circle(float R) { r = R; }
float area() { return 3.14 * r * r; }
};
class Rectangle : public Shape {
private:
float h, w;
public:
Rectangle(float H, float W) { h = H; w = W; }
float area() { return h * w; }
};
int main() {
Shape* s;
Circle c(5);
Rectangle r(4, 6);
//向上转型,将指向子类对象的指针转换为指向基类对象的指针
s = &c;
//输出结果
cout << "Circle area: " << s->area() << endl; //78.5
//向下转型,将指向基类对象的指针转换为指向子类对象的指针
Circle* cPtr = dynamic_cast<Circle*>(s);
//输出结果
cout << "Circle area: " << cPtr->area() << endl; //78.5
//将指向子类对象的指针转换为指向基类对象的指针
s = &r;
//输出结果
cout << "Rectangle area: " << s->area() << endl; //24
//向下转型,将指向基类对象的指针转换为指向子类对象的指针
Rectangle* rPtr = dynamic_cast<Rectangle*>(s);
//输出结果
cout << "Rectangle area: " << rPtr->area() << endl; //24
return 0;
}
在这个示例中,我们首先定义了一个基类对象和两个子类对象(圆形和矩形)。然后使用向上转型和向下转型实现了基类指针和子类指针之间的相互转换。最后,我们通过每个指针调用在每个类中实现的计算面积的函数,输出它们的面积。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 基类指针和子类指针相互赋值的实现方法 - Python技术站