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

时间:2014-04-21 14:02:38

标签: c++

我有3个班级

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

现在我想使用C中的一些成员函数,这些成员函数已在A中虚拟化并已在B中被覆盖。当我尝试从A访问C的成员时,它会给出一个错误,指出C不是A的直接基类。

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

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

4 个答案:

答案 0 :(得分:1)

这是你的意思吗?

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(); }
};

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

答案 1 :(得分:1)

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

赢得这还不够吗?

答案 2 :(得分:0)

你的问题不是很清楚。您是否在询问如何拨打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 ::美孚()
    B ::美孚()
    Ç::富()
    C :: Foo()

  

答案 3 :(得分:0)

  

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

只要从继承保护范围可见,您就可以显式引用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();
    }
};