具有纯虚函数的 C++ 继承

标签 c++ inheritance

我正在尝试创建一个用作基础对象的类,然后将其子类化(=实现)以服务于各种目的。

我想定义一个或多个纯虚函数,以便无论对基类进行子类化,都需要并且不会忘记实现它们。

有一个警告,纯虚函数的签名包括基础对象的类型。一旦子类化,函数定义当然不再与基类定义匹配。例如:

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/

相关文章:

java - 多层次的子类和方法链接

c++ - 为什么 AF_INET 不能与 SOCK_STREAM 一起工作?

c++ - 如何通过包含要打印的字符串的类函数打印异常?

Java:继承类构造函数正在调用父类(super class)

c++自动推导派生类

c++ - 通过 C++ 中的构造函数将地址参数传递给基类指针

java - 如何在java中的const变量中保存Date对象

c++ - 将对象 vector 写入文件

C++ - 无法修改类成员函数中的指针

c++ - 在 cpp 文件中正确使用函数定义的命名空间