C++ 理解虚函数 //多重继承 #包括 使用名称空间std; 类多边形{ 受保护的: int宽度、高度; 公众: 多边形(inta,intb):宽度(a),高度(b){} 虚拟整数区域()=0; 虚拟空打印(){ 库特
由于C++ 理解虚函数 //多重继承 #包括 使用名称空间std; 类多边形{ 受保护的: int宽度、高度; 公众: 多边形(inta,intb):宽度(a),高度(b){} 虚拟整数区域()=0; 虚拟空打印(){ 库特,c++,inheritance,C++,Inheritance,由于Rectangle中的area()不是虚拟的,它应该从Rectangle调用area() 它实际上是virtual,因为它是在基类中声明的virtual。此属性会自动转移到继承类的成员函数声明中 请参阅标准,虚拟函数[class.Virtual](重点): 如果虚拟成员函数vf在类基和派生类中声明,直接或间接派生 从Base开始,一个具有相同名称、参数类型列表(8.3.5)、cv限定符和REF限定符的成员函数vf (或不存在相同的)如果声明了Base::vf,那么派生::vf也是虚拟的(,不
Rectangle
中的area()
不是虚拟的,它应该从Rectangle
调用area()
它实际上是virtual
,因为它是在基类中声明的virtual
。此属性会自动转移到继承类的成员函数声明中
请参阅标准,虚拟函数[class.Virtual](重点):
如果虚拟成员函数vf
在类基和派生类中声明,直接或间接派生
从Base开始,一个具有相同名称、参数类型列表(8.3.5)、cv限定符和REF限定符的成员函数vf
(或不存在相同的)如果声明了Base::vf
,那么派生::vf也是虚拟的(,不管它是否是虚拟的)
因此声明了),它覆盖了Base::vf
旁注。从矩形中导出一个正方形可能是因为它违反了Liskov替换原理。它不应该从
正方形中调用面积()
?@直线好的,是的。这就是我要说的?@πάνταῥεῖ 你说的是“它应该从矩形中调用area()
”@直线不,这个答案解释了它调用area()的原因
从正方形
而不是矩形
@直线所有面积
函数都是虚拟的,因此应该调用正方形
面积
。从什么时候开始,正方形宽度*高度/2???
// multiple inheritance
#include <iostream>
using namespace std;
class Polygon {
protected:
int width, height;
public:
Polygon (int a, int b) : width(a), height(b) {}
virtual int area()=0;
virtual void print(){
cout << "area = " << area() << endl;
};
};
class Rectangle: public Polygon{
public:
Rectangle (int a, int b) : Polygon(a,b) {}
int area () { return width*height; }
void print(){
cout << "area = " << area() << endl;
};
};
class Square: public Rectangle{
public:
Square (int a, int b) : Rectangle(a,b) {}
int area () { return width*height/2; }
};
int main () {
Square sq (4,5);
sq.print ();
return 0;
}