抽象基类成员变量

use*_*257 2 c++ qt

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

dte*_*ech 6

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

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

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

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 也会隐式虚拟,为清楚起见,有些人更喜欢在派生类中将方法写为虚拟方法,但是一旦在基类中为虚拟方法,方法在派生类中也将是隐式虚拟的。