📜  C++ |继承|问题8(1)

📅  最后修改于: 2023-12-03 14:59:48.169000             🧑  作者: Mango

C++ 继承问题8

继承是 C++ 面向对象编程中的重要概念,它允许一个类继承另一个类的特征和行为。在使用继承时,派生类会继承基类的所有成员(公共成员、保护成员和私有成员),并且可以根据需要增加自己的新成员和方法。

问题描述

在使用继承时,如果基类和派生类的成员函数参数列表相同,但返回类型不同,会发生什么?

#include <iostream>
using namespace std;

class Base {
public:
    int foo() { return 1; }
};

class Derived : public Base {
public:
    double foo() { return 2.0; }
};

int main() {
    Derived d;
    cout << d.foo() << endl;  // 输出 2.0 还是 1?
    return 0;
}
问题分析

在上述代码中,Derived 类继承了 Base 类的 foo() 方法并重新定义了它,使返回类型从 int 变成了 double。那么结果会是什么呢?

根据 C++ 的规定,派生类中的函数会覆盖掉与基类中同名、同参数的函数,只要它们不是 private 的。因此,在上面的代码中,Derivedfoo() 方法会覆盖掉 Basefoo() 方法,所以调用 Derived 对象的 foo() 方法,会返回 2.0,而不是 1

解决方法

为了避免上述问题,应该确保派生类中覆盖掉基类方法的返回类型与基类方法的返回类型相同或是其子类。如果返回类型不同,则必须使用类型转换来解决该问题。

#include <iostream>
using namespace std;

class Base {
public:
    int foo() { return 1; }
};

class Derived : public Base {
public:
    double foo() { return 2.0; }
};

int main() {
    Derived d;
    cout << static_cast<Base>(d).foo() << endl;  // 输出 1
    return 0;
}

在上面的代码中,将 Derived 对象显式转换成 Base 对象再调用 foo() 方法,就可以得到正确的结果。这是因为在类型转换期间,会调用基类的 foo() 方法,而不是派生类的 foo() 方法。

总结

继承是 C++ 中非常重要的概念。在使用继承时,需要注意使用方法的返回类型必须相同或是其子类,否则会出现覆盖效果导致程序运行错误的问题。要避免这种问题,可以使用类型转换来解决。