抽象基类成员变量

问题描述 投票:0回答:2

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

c++ qt
2个回答
3
投票

非营利性公司是一家公司,营利性公司是公司,但公司不是名称,并且它不是形成日期,而是公司有名称和成立日期。

“是一种”关系是继承。 “有”关系是聚合。

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

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 ++就会自动生成虚拟析构函数,并且信息也将隐式虚拟化,为了清楚起见,有些人更喜欢在派生类中将方法编写为虚拟,但是一旦在基类中虚拟化,方法也将在派生类中隐式虚拟。


1
投票

是的,base和derived之间的关系是“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; 
   }
};
© www.soinside.com 2019 - 2024. All rights reserved.