C++多重继承方法重载

标签 c++ inheritance pure-virtual

#include <iostream>

using namespace std;

class Base1 {
public:
    virtual void f(int n) = 0;
};

class Base2 {
public:
    virtual void f(char *s) = 0;
};

class Derive1 : public Base1, public Base2 {
public:
    void f(int n) { cout << "d1 fn" << endl; }
    void f(char *s) { cout << "d1 fs" << endl; }
};

class Derive2 : public Derive1 {
public:
    void f(int n) { cout << "d2 fn" << endl; }
    void f(char *s) { cout << "d2 fs" << endl; }
};

int main() {
    Derive1 *d1 = new Derive2();
    int n = 0;
    char *s = "";
    d1->f(n);
    d1->f(s);
    return 0;
}

上面的代码运行正常,但是如果我注释掉Derive1的一个方法,就会出现转换错误;如果我注释掉 Derive1 的两种方法,则会出现方法歧义错误。

让我困惑的是,为什么Derive1必须定义这两个方法,为什么只在Derive2中定义它们是行不通的。我需要一些帮助来理解这一点。

一些说明:

  1. 假设我永远不想创建 Derive1 的任何实例。所以,如果 Derive1 是一个抽象类,那完全没问题。

  2. “所有纯虚函数都应该在派生类中有一个定义。”如果我不想创建此派生类的实例,则情况并非如此。

  3. 如果我将 Base1 中的 f 更改为 f1,将 Base2 中的 f 更改为 f2(只需更改名称),那么 Derive1 不需要定义它们中的任何一个,只需在 Derive2 中定义 f1 和 f2 即可。

所以,在方法重载的支持下,我想,在上面的代码中,我在Base1中声明了一个名称为f_int的函数;在 Base2 中,我声明了一个名为 f_str 的函数。这就是编译器如何实现方法重载的方式,对吧?但似乎并非如此。

最佳答案

Derive1Base1Base2 的派生类。派生类必须实现其基类的所有虚函数。

Derive2 实现这些功能对 Derive1 没有帮助,因为可以实例化一个 Derive1,并这样做必须实现所有继承的纯虚方法。

例如,如果您没有实现 Derive1 中的函数,您期望它的行为是什么?

Derive1* d1 = new Derive1;
int n = 0;
char *s = "";
d1->f(n);
d1->f(s);

Derive1 没有实现这些,d1 不是 Derive2 实例,那么它应该做什么?

关于C++多重继承方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30399671/

相关文章:

oop - 将子类转换为父类

inheritance - 使用函数式编程风格数据类型的模型继承

c++ - 编译器说定义的函数是虚拟的

c++ - 如何在具有抽象类多重继承的 C++ 中使用 clone()?

c++ - C++ 中具有 std::vector 数据成员的 constexpr 成员函数

c++ - 在笔记本电脑上开发没有 GPU 支持的 OpenCL 应用程序?

c++ - OpenCv:填充字符

c++ - 在运行时定义循环

java - isEmpty() 的实现

C++多态/纯虚函数