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;
}