如何在继承类中再次使用虚拟函数

how to use a virtual function again in an inherited class

本文关键字:虚拟 函数 继承      更新时间:2023-10-16

我有三个类,即

class A;
class B;
class C : public B {
};

现在我想在C中使用一些成员函数,这些函数在A中被虚拟化,在B中被重写。当我试图从C访问A的成员时,它会给出一个错误,说C不是a的直接基类。

我该怎么办?我应该再写一次那段代码吗?

我搜索了其他网站,得到了混乱的答案,这破坏了我的继承概念,所以请给出一个描述性但清晰的答案

这就是你的意思吗?

class A {
  public:
    virtual int f() { return 42; }
};
class B : public A {
  public:
    int f() { return 0; }
};
class C : public B {
  public:
    int g() { return f(); }
};

没有什么特别的事情可做。

void C::f() { return A::f(); }

这还不够吗?

您的问题不是很清楚。您是否在询问如何调用AB版本的函数?如果是这样的话,你可以这样做:

#include <iostream>
struct A
{
    virtual void Foo () {
        std::cout << "A::Foo()" "n" ;
    }
};
struct B : public A
{
    void Foo () {
        std::cout << "B::Foo()" "n" ;
    }
};
struct C : public B
{
    void Foo () {
        std::cout << "C::Foo()" "n" ;
    }
};
int main (void)
{
    C c ;
    c.A::Foo () ;
    c.B::Foo () ;
    c.Foo () ;
    A *p1 = &c ;
    p1->Foo () ;
    return 0 ;
}

输出:

A: :Foo()
B: :Foo()
C: :Foo()
C: :Foo()

我该怎么办?我应该再写一次那段代码吗?

您总是可以显式引用class A中声明的方法,只要它们在您的继承保护范围中可见:

class A {
public:
    virtual void foo() {}
};
class B : public A {
public:
    virtual void foo() { 
        // do something else
    }
};
class C : public B {
public:
    virtual void foo() { 
        // use A's implementation again
        A::foo();
    }
};