C++多态性,关于宣布对派生类的基础类引用

C++ polymorphism, about announcing a basis class reference to a derived class

本文关键字:基础类 引用 派生 多态性 于宣布 C++      更新时间:2023-10-16
#include <iostream>
using namespace std;
class A {
private:
    int nVal;
public:
    void Fun()
    {
        cout << "A::Fun" << endl;
    }
    void Do()
    {
        cout << "A::Do" << endl;
    }
};
class B :public A {
public:
    virtual void Do()
    {
        cout << "B::Do" << endl;
    }
};
class C :public B {
public:
    void Do()
    {
        cout << "C::Do" << endl;
    }
    void Fun()
    {
        cout << "C::Fun" << endl;
    }
};
void Call(B& p)
{
    p.Fun(); p.Do();
}
int main() {
    C c; Call(c);
    return 0;
}

在上面的代码中,输出为

A::Fun
C::Do

但是我无法理解。 在函数调用(B&p(中,引用p应该引用C类中的c,所以为什么输出不是

C::Fun
C::Do

在宣布对派生类的基础类引用时,不同的基础类是否有意义?

问题是A::Fun没有被标记为virtual,因此它在运行时找不到C::Fun。您应该将其标记为:

class A {
private:
    int nVal;
public:
    virtual void Fun()
    {
        cout << "A::Fun" << endl;
    }
// ...

魔杖盒示例


这是一个很好的错误示例,由于override说明符,可以在编译时捕获该错误:

class C :public B {
public:
    void Do() override
    {
        cout << "C::Do" << endl;
    }
    void Fun() override
    {
        cout << "C::Fun" << endl;
    }
};

将打印:

error: 'void C::Fun()' marked 'override', but does not override
     void Fun() override
          ^~~

魔杖盒示例