C++基础之this指针与另一种“多态”
1. this指针是什么?
在C++中,this指针有一个特殊的用途,它指向当前对象的指针。我们通常使用this指针来访问当前对象的成员变量和成员函数。
class Person {
private:
string name;
public:
Person(string name) {
this->name = name;
}
void sayName() {
cout << "My name is " << this->name << endl;
}
};
在上述代码中,我们可以看到,通过使用this->name
我们可以访问当前对象的name
成员变量并输出其值。
2. 另一种“多态”
我们都知道,C++中通过虚函数和继承可以实现多态,但实际上还存在另一种多态的实现方式。
考虑下面的代码片段:
class Parent {
public:
void function1() {cout << "parent function1" << endl;}
void function2() {cout << "parent function2" << endl;}
};
class Child : public Parent {
public:
void function1() {cout << "child function1" << endl;}
void function2(int x) {cout << "child function2" << endl;}
};
在上述代码中,Child
类继承了Parent
类,并重载了其中的两个函数function1
和function2
。如果我们使用以下代码调用这两个函数:
Child child;
child.function1();
child.function2(1);
那么输出结果将是:
child function1
child function2
这是因为在对象中,函数调用的地址是在编译时确定的,而不是在运行时根据对象的类型确定。因此,即使我们创建了一个Child
对象,在调用function1
和function2
时也会调用Child
类中的版本,并不会调用Parent
类中对应的函数。
3. 示例说明
为了更好地理解上述概念,我们来看一下以下示例:
class Shape {
public:
virtual void area() = 0;
};
class Rectangle : public Shape {
private:
int width;
int height;
public:
Rectangle(int width, int height) {
this->width = width;
this->height = height;
}
void area() override {
cout << "Rectangle area: " << width * height << endl;
}
};
class Triangle : public Shape {
private:
int base;
int height;
public:
Triangle(int base, int height) {
this->base = base;
this->height = height;
}
void area() override {
cout << "Triangle area: " << base * height / 2 << endl;
}
};
在上述代码中,我们定义了一个抽象基类Shape
,并在其基础上派生了两个子类Rectangle
和Triangle
,并分别覆盖了其纯虚函数area
。现在我们可以使用以下代码来计算这两个类的面积:
int main() {
Shape *shape;
Rectangle rect(3, 4);
Triangle tri(3, 4);
shape = ▭
shape->area();
shape = &tri;
shape->area();
return 0;
}
在上面的代码中,我们创建了一个Shape
类型的指针shape
,并将其分别指向了Rectange
和Triangle
对象。当我们调用shape->area()
时,将会调用相应的子类内部实现,这就是另一种多态的实现方式。
另外,我们也可以使用dynamic_cast
函数来进行类型转换,具体代码如下:
int main() {
Shape *shape;
Rectangle rect(3, 4);
Triangle tri(3, 4);
shape = ▭
Rectangle *rectShape = dynamic_cast<Rectangle *>(shape);
rectShape->area();
shape = &tri;
Triangle *triShape = dynamic_cast<Triangle *>(shape);
triShape->area();
return 0;
}
在上述代码中,我们将shape
指针分别转换成了Rectangle
和Triangle
类型,并分别调用了其area
函数。需要注意的是,使用dynamic_cast
进行类型转换时,如果转换失败将返回nullptr
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++基础之this指针与另一种“多态” - Python技术站