我正在尝试创建一个用作基础对象的类,然后将其子类化(=实现)以服务于各种目的。
我想定义一个或多个纯虚函数,以便无论对基类进行子类化,都需要并且不会忘记实现它们。
有一个警告,纯虚函数的签名包括基础对象的类型。一旦子类化,函数定义当然不再与基类定义匹配。例如:
class BaseItem
{
public:
virtual std::string getDifferences(const BaseItem& item) = 0;
}
所以,在派生类中我想做的是:
class DerivedClass : public BaseItem
{
public:
virtual std::string getDifferences(const DerivedClass& item) = 0;
private:
std::string derivedItemCustomObject;
}
编译器当然不会接受。当然,我可以将其设为 BaseItem
,但这样我就无法使用派生类中的任何对象。
我是否必须使用转换来完成此操作?
如果我的意图/问题不清楚,请告诉我。
最佳答案
无需更改函数签名。请看以下内容:
class BaseItem
{public:
virtual std::string getDifferences(const BaseItem& item) = 0;
};
class DerivedClass : public BaseItem
{public:
virtual std::string getDifferences(const BaseItem& item) // keep it as it's
{
const DerivedClass& derivedItem = static_cast<const DerivedClass&>(item);
}
};
可以使用static_cast<>
没有任何恐惧,因为,DerivedClass::getDifferences()
只为 DerivedClass
调用目的。为了说明,
BaseItem *p = new DerivedClass;
DerivedClass obj;
p->getDifferences(obj); // this always invoke DerivedClass::getDifferences
如果您担心有时您可能最终将任何其他派生类对象作为参数传递给该方法,那么请使用 dynamic_cast<>
相反,如果转换失败则抛出异常。
关于具有纯虚函数的 C++ 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6004501/