C++中的继承和纯虚函数
Posted
技术标签:
【中文标题】C++中的继承和纯虚函数【英文标题】:inheritance and pure virtual function in c++ 【发布时间】:2014-08-13 05:04:59 【问题描述】:我没有通过这个程序获得所需的输出。我收到的警告是:
-
“shape”类具有虚拟方法“shap”但非虚拟析构函数。
lass 'square' 具有虚拟方法 'shap' 但非虚拟析构函数。
类 'rectangle' 具有虚拟方法 'shap' 但非虚拟析构函数。
虽然程序编译没有任何错误,但我没有得到必须是 20 和 18 的答案。我也无法理解这些警告的含义。为什么屏幕上没有显示答案?如果我要通过构造函数来初始化,我应该如何初始化长度和宽度的值。
#include <iostream>
using namespace std;
class shape
int length;
int breadth;
public:
int area;
virtual int shap(int, int) = 0;
;
class square : public shape
public:
int shap(int length, int breadth) return area = length * breadth;
;
class rectangle : public shape
public:
int shap(int length, int breadth) return area = length * breadth;
;
int main()
shape* s;
square sq;
rectangle rect;
s = &sq;
s->shap(4, 5);
s = ▭
s->shap(6, 3);
return 0;
【问题讨论】:
您在打印值之前返回。 “显示在屏幕上”?您如何期望程序知道您希望在屏幕上显示某些内容? C++ 中的任何内容都不会自行“显示在屏幕上”。应该是您将内容发送到要显示的屏幕上。但是你永远不会在你的代码中这样做。这就是为什么什么都没有显示的原因。 出现这些警告是因为您应该在基类形状中定义一个虚拟析构函数,例如:virtual ~shape(); @AndreyT- 好的,你说得对。但是我应该在哪里给出 cout 语句 - 在 main 或函数定义中? cout shap(6,3);应该工作。 【参考方案1】:我没有通过这个程序获得所需的输出。警告 我得到的是:
Class 'shape' has virtual method 'shap' but non-virtual destructor. lass 'square' has virtual method 'shap' but non-virtual destructor. Class 'rectangle' has virtual method 'shap' but non-virtual destructor.
要清除警告,就像警告所说的一样。
将它们的析构函数添加到各自的类中。
virtual ~shape();
virtual ~rectangle()
virtual ~square();
对于 rectangle::shap 和 square::shap,在其前面添加一个 virtual。
【讨论】:
但是为什么我需要声明虚拟析构函数呢?它有什么帮助? @user3012742:除了使警告静音(如果您实际定义它们alavirtual ~shape()
而不仅仅是根据此答案声明它们)之外,您不会也不会。编译器发出警告是因为虚函数的存在表明某些代码有朝一日可能希望使用基类指针存储动态分配的对象,而 delete
通过该基类指针将不起作用,除非析构函数的 virtual
.
@AngelKoh "对于 rectangle::shap 和 square::shap,在它前面添加一个 virtual。" - C++11 的最佳实践是添加override
而不是virtual
,值得指出的是,这些选项中的任何一个都没有功能上的差异...virtual
只是文档,override
是编译器-检查。
谢谢..我明白了这个概念..另外,我如何在这里使用构造函数来初始化值?以上是关于C++中的继承和纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章