如何理解此C++代码中的动态绑定?

How to understand the dynamic binding in this C++ code?

本文关键字:动态绑定 代码 何理解 C++      更新时间:2023-10-16

这是我的代码。我需要帮助使此动态绑定正常工作。

#include<iostream>
#include<conio.h>
using namespace std;
class Shape {
protected:
double x,y;
public:
void get_data(double a,double b=3.14)   {
x=a;
y=b;
}   
virtual void display_area(){
};
};
class Rectangle : public Shape  {
public:
void display_area() {
cout<<"nArea of Rectangle : "<<x*y<<" units.n";
}
};
class Circle : public Shape {
public:
void display_area() {
cout<<"nArea of Circle : "<<y*x*x<<" units.n";
}
};
class Triangle : public Shape   {
public:
void display_area() {
cout<<"nArea of Triangle : "<<0.5*x*y<<" units.n";
}
};
main()  {
Shape *ptr;
char opt,wait;
double a,b;
do{
system("cls");
cout<<"n1.Area of Rectanglen2.Area of Circlen3.Area of Trianglen4.ExitnnEnter your Option : ";
opt=getche();
switch(opt) {
case '1':
*ptr = new Rectangle;
cout<<"nEnter Length : ";
cin>>a;
cout<<"nEnter Width  : ";
cin>>b;
ptr->get_data(a,b);
ptr->display_area();
break;
case '2':
*ptr = new Circle;
cout<<"nEnter Radius : ";
cin>>a;
ptr->get_data(a);
ptr->display_area();
break;
case '3':
*ptr = new Triangle;
cout<<"nEnter Base   : ";
cin>>a;
cout<<"nEnter Height : ";
cin>>b;
ptr->get_data(a,b);
ptr->display_area();
break;
case '4':
cout<<"nnGoodBye ! Have a Nice Day !n";
exit(0);
default:
cout<<"nnEnter a Valid Option !n";
}
cout<<"nnPress Any Key to Continue....";
wait=getche();
}while(opt!='4');
}

我得到的错误是:

5   7  [Note] Shape& Shape::operator=(const Shape&)
5   7  [Note] no known conversion for argument 1 from 'Rectangle*' to 'const Shape&'
55  10 [Error] no match for 'operator=' (operand types are 'Shape' and 'Circle*')
55  10 [Note] candidate is:
5   7  [Note] Shape& Shape::operator=(const Shape&)
5   7  [Note] no known conversion for argument 1 from 'Circle*' to 'const Shape&'
62  10 [Error] no match for 'operator=' (operand types are 'Shape' and 'Triangle*')
62  10 [Note] candidate is:
5   7  [Note] Shape& Shape::operator=(const Shape&)
5   7  [Note] no known conversion for argument 1 from 'Triangle*' to 'const Shape&'

您分配ptr不正确。在为其分配对象时,不应取消引用它。

更改此内容

*ptr = ...;

对此

ptr = ...;

此外,您正在泄漏使用new分配的对象。使用完每个对象后,需要调用delete ptr;。这也意味着您需要向Shape添加一个虚拟析构函数,以便正确调用正确的后代析构函数:

class Shape {
... 
public:
virtual ~Shape() {}
...
};

我想补充一下。不要使用原始指针。 如果您使用智能桥 std::unique_ptr 那么您可以避免错误。而且您无需考虑删除对象。 例如:

std::unique_ptr<Shape> ptr;
ptr = std::make_unique<Rectangle>();