非营利公司是公司,营利公司是公司,但公司不是名称,也不是成立日期,而是公司有名称和成立日期。
“是一个”关系是继承。“有一个”关系是聚合。
如果两家公司共享相同的成员,那么这些成员应该在基类中,因为代码重用是继承的主要思想之一(多态除外)
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; }
};
Run Code Online (Sandbox Code Playgroud)
和用法:
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
Run Code Online (Sandbox Code Playgroud)
多态在行动:
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
Run Code Online (Sandbox Code Playgroud)
还要注意的是,即使派生类没有声明虚拟析构函数,并且 info 不是显式虚拟的,只要基类具有声明的虚拟析构函数,C++ 就会自动生成虚拟析构函数,并且 info 也会隐式虚拟,为清楚起见,有些人更喜欢在派生类中将方法写为虚拟方法,但是一旦在基类中为虚拟方法,方法在派生类中也将是隐式虚拟的。
| 归档时间: |
|
| 查看次数: |
8481 次 |
| 最近记录: |