如何理解此 C++ 代码中的动态绑定?
How to understand the dynamic binding in this C++ code?
这是我的代码。我需要帮助才能使此动态绑定正常工作。
#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 Rectangle\n2.Area of Circle\n3.Area of Triangle\n4.Exit\n\nEnter 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<<"\n\nGoodBye ! Have a Nice Day !\n";
exit(0);
default:
cout<<"\n\nEnter a Valid Option !\n";
}
cout<<"\n\nPress 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() {}
...
};
我要补充。不要使用原始指针。
如果你使用了smart ponter std::unique_ptr 那么你就可以避免错误。而且您无需考虑删除对象。
例如:
std::unique_ptr<Shape> ptr;
ptr = std::make_unique<Rectangle>();
这是我的代码。我需要帮助才能使此动态绑定正常工作。
#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 Rectangle\n2.Area of Circle\n3.Area of Triangle\n4.Exit\n\nEnter 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<<"\n\nGoodBye ! Have a Nice Day !\n";
exit(0);
default:
cout<<"\n\nEnter a Valid Option !\n";
}
cout<<"\n\nPress 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() {}
...
};
我要补充。不要使用原始指针。 如果你使用了smart ponter std::unique_ptr 那么你就可以避免错误。而且您无需考虑删除对象。 例如:
std::unique_ptr<Shape> ptr;
ptr = std::make_unique<Rectangle>();