10.4继承与多态性
1.回到电子表格
略
2.设计多态性的电子表格单元格
略
3.SpreadsheetCell基类
3.1初次尝试
略
3.2纯虚方法和抽象基类
纯虚方法(pure virtual methods)在类定义中显式说明该方法不需要定义。如果将某个方法设置为纯虚方法,就是告诉编译器当前类中不存在这个方法的定义。具有至少一个纯虚方法的类称为抽象类,因为这个类不能被实例化。编译器会强制接受这个事实: 如果某个类包含一个或多个纯虚方法,就无法构建这种类型的对象。
采用专门的语法指定纯虚方法∶方法声明后紧接着=0
。
抽象类提供了一种禁止其他代码直接实例化对象的方法, 而它的派生类可以实例化对象。
4.独立的派生类
独立的派生类必须实现从父类继承的所有纯虚方法。如果派生类没有实现从父类继承的所有纯虚方法,那么派生类也是抽象的,客户就不能实例化派生类的对象。
5.利用多态性
对于实现抽象基类所有纯虚方法的派生类, 可以使用基类的指针指向派生类.
class Base
{
public:
virtual void set(string_view inStr) = 0;
virtual string getStr() const = 0;
virtual ~Base();
};
class DerivedString: public Base
{
public:
void set(string_view inStr) override;
string getStr() const override;
private:
optional<string> m_value{};
};
class DerivedDouble: public Base
{
public:
virtual void set(double value);
void set(string_view inStr) override;
string getStr() const override;
private:
static string doubleToString(double value);
static double stringToDouble(string_view value);
optional<double> m_value{};
};
vector<unique_ptr<Base>> cellArray;
cellArray.push_back(make_unique<DerivedString>());
cellArray.push_back(make_unique<DerivedString>());
cellArray.push_back(make_unique<DerivedDouble>());