使用多态赋值

Using polymorphic assignment

本文关键字:赋值 多态      更新时间:2023-10-16

我对c++编程非常陌生,并试图理解这种多态赋值。我在网上进行了研究,并看到了多个例子,但唯一有意义的是跟踪非多态内存占用,你有父类和派生类。如果你有一个父类,然后有多个派生类。如何使用基类指针类型变量的多态赋值来调用父类中的方法。因此,使用该方法生成父类和派生类的输出。我所要求的只是你能在书中找到的清晰度,这样我就能理解这个概念。然后我将创建我自己的测试用例。谢谢你的帮助!

#include<iostream>
using namespace std;
class base
{
public:
    int baseVariable;
    base(int arg=0):baseVariable(arg) {}
    virtual void print()=0;
};
class derivedOne:public base
{
public:
    derivedOne(int arg=0):base(arg){}
     void print()
     {
         cout<<"Printing with derivedOne's print function.baseVarible = "<< base::baseVariable<<endl;
     }
};
class derivedTwo:public base
{
public:
    derivedTwo(int arg=0):base(arg){};
    void print()
    {
         cout<<"Printing with derivedTwo's print function.baseVarible = "<< base::baseVariable<<endl;
    }
};
int main()
{
    base *obj1=new derivedOne(5);
    base *obj2=new derivedTwo(7);
    obj1->print();
    obj2->print();
    return 0;
}
我想这就是你想要的。

这是相当古老的一个,但也许是另一个解释多态赋值的尝试(取自Alan Ezust, Paul Ezust在CPP与Qt第2版中的设计模式介绍)

假设你有一个抽象基类:

class Shape {
public:
    virtual double area() = 0;
    virtual QString getName() = 0;
    virtual QString getDimensions() = 0;
    virtual ~Shape() {}
};

你有两个继承自这个基类的类:

class Rectangle : public Shape {
public:
    Rectangle(double h, double w) : m_Height(h), m_Width(w) {}
    double area();
    QString getName();
    QString getDimensions();
protected:
    double m_Height, m_Width;
};
class Circle : public Shape {
public:
    Circle(double r) : m_Radius(r) {}
    double area();
    QString getName();
    QString getDimensions();
private:
    double m_Radius;
};

你有你的主应用程序:

#include "shapes.h"
#include <QString>
#include <QDebug>
void showNameAndArea(Shape* pshp) {
    qDebug() << pshp->getName() << " " << pshp->getDimensions()
             << " area= " << pshp->area();
}
int main() {
    Rectangle rectangle(4.1, 5.2);
    Circle circle(6.1);
    showNameAndArea(&rectangle);
    showNameAndArea(&circle);
    return 0;
}

在全局函数showNameAndArea中,基类指针pshp依次被赋予三个子类的对象地址。对于每个地址分配,pshp以多态方式调用Rectangle和Circle类的正确getName和area函数。