抽象基类成员变量

Abstract base class member variables

本文关键字:变量 成员 基类 抽象      更新时间:2023-10-16

我有一个抽象基类"Company"和两个派生自"Company"的子类"notForProfit"answers"forProfit"。两个子类都有成员变量"name"answers"dateFormed"。是否有可能在"公司"中定义这2个成员变量,并有2个子类继承"Name"answers"DateFormed"在其构造函数中使用?

非营利性公司是公司,营利性公司是公司,但公司不是名称,也没有成立日期,而是公司有名称和成立日期。

"Is a"关系是继承。"有"关系是聚合。

如果两个公司共享相同的成员,那么这些成员应该在基类中,因为代码重用是继承的主要思想之一(除了多态性)

class Company {
protected:
    Company(QString n, QDate df) : name(n), dateFormed(df) { } // protected constructor, can't create a Company instance
    QString name; // protected data members, cannot be accidentally changed
    QDate dateFormed;
public:
    virtual ~Company() {} // you always need a virtual destructor for polymorphism
    virtual void info() = 0; // abstract method, must be implemented in order to instantiate derived classes    
};
class NonProfit : public Company {
public:
    NonProfit(QString n, QDate df) : Company(n, df) { }
    void info() { qDebug() << "Non-profit company" << name << "formed on" << dateFormed; }
};
class ForProfit : public Company {
public:
    ForProfit(QString n, QDate df) : Company(n, df) { }
    void info() { qDebug() << "For-profit company" << name << "formed on" << dateFormed; }
};

和用法:

Company cp("some company", QDateTime::currentDateTime().date()); // won't work
NonProfit np("some company", QDateTime::currentDateTime().date());
np.info(); // Non-profit company "some company" formed on 2015-08-15

多态性的作用:

Company * c1 = new NonProfit("some company", QDateTime::currentDateTime().date());
Company * c2 = new ForProfit("some company", QDateTime::currentDateTime().date());
c1->info(); // Non-profit company "some company" formed on 2015-08-15
c2->info(); // For-profit company "some company" formed on 2015-08-15

还要注意,即使派生类没有声明的虚析构函数,而且info也不是显式虚的,只要基类有声明的虚析构函数,c++就会自动生成虚析构函数,而且info也将隐式虚的,有些人为了清晰起见更喜欢在派生类中将方法写为虚的,但是一旦在基类中是虚的,方法在派生类中也将隐式虚的。

是的,基类和派生类之间的关系是"is a",基类拥有的一切,派生类也拥有。

代码片段:

// derived classes
#include <iostream>
using namespace std;
class Polygon 
{
protected:
int width, height;
public:
    void set_values (int a, int b) 
    { 
       width=a; 
       height=b;
    }
};
class Rectangle: public Polygon 
{
public:
    int area ()
    { 
         return width * height; 
    }
};
class Triangle: public Polygon 
{
public:
   int area ()
   {  
      return width * height / 2; 
   }
};