抽象基类成员变量
Abstract base class member variables
我有一个抽象基类"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;
}
};
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组