简单的c++ /OOP继承

Simple C++/OOP inheritance

本文关键字:OOP 继承 c++ 简单      更新时间:2023-10-16

我想知道这是否可能

/* C++ Program to calculate the area and perimeter of rectangles using concept of inheritance. */
#include <iostream>
using namespace std;
class Rectangle
{
    protected:
       float length, breadth;
    public:
        Rectangle(): length(0.0), breadth(0.0)
        {
            cout<<"Enter length: ";
            cin>>length;
            cout<<"Enter breadth: ";
            cin>>breadth;
        }
};
/* Area class is derived from base class Rectangle. */
class Area : public Rectangle   
{
    public:
       float calc()
         {
             return length*breadth;
         }
};
/* Perimeter class is derived from base class Rectangle. */
class Perimeter : public Rectangle
{
    public:
       float calc()
         {
             return 2*(length+breadth);
         }
};
int main()
{
     cout<<"Enter data for first rectangle to find area.n";
     Area a;
     cout<<"Area = "<<a.calc()<<" square meternn";
     cout<<"Enter data for second rectangle to find perimeter.n";
     Perimeter p;
     cout<<"nPerimeter = "<<p.calc()<<" meter";
     return 0;
}

考虑到上面的代码,是否有可能在main中调用a.c calc(),这将执行其代码,但在我们返回之前,让它从Parameter中调用calc(),而不在Area或Rectangle中创建圆周对象

谢谢!

技术上的答案是添加函数声明:

virtual float calc() = 0;

Rectangle将允许您在main中调用a.calc(),但这不是继承的好情况。把"A继承B"想象成"AB"。说"AreaRectangle"或"PerimeterRectangle"是没有意义的。"Rectangle是一个Shape"这样说会更有意义。

在你提出的情况下,我将只是将float getArea()float getPerimeter()函数添加到Rectangle,而根本不使用继承。你说这只是一个例子,所以也许问一下你的实际的用例会得到更好的答案。

编辑:

我仔细看了一下,发现a只是一个Area类型的变量,所以我提到的函数声明在技术上是不需要的

是否有一种方法可以从B:Foo()访问C:Foo()而无需在a或B中创建C对象?

。因为C::Foo()private,所以你根本不能从B::Foo()访问它。

始终使用"is a" vs。有一个"比较"来决定何时使用继承。

A Rectangle *has a* perimeter

因此,perimeter应该是Rectangle的成员变量(或者在这种情况下,它甚至可以只是一个函数)。

但是,对于像 这样的例子,
Honda *is a* car

Honda应该继承父类car