我有3个班级
class A;
class B;
class C : public B {
};
现在我想使用C
中的一些成员函数,这些成员函数已在A
中虚拟化并已在B
中被覆盖。当我尝试从A
访问C
的成员时,它会给出一个错误,指出C不是A的直接基类。
我该怎么办?我应该再写那段代码吗?
我搜索了其他网站并得到了混乱的答案,这破坏了我的继承概念,所以请给出一个描述性但明确的答案
答案 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)
你的问题不是很清楚。您是否在询问如何拨打A
或B
的该功能版本?如果是这样,你可以这样做:
#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();
}
};