我有:
class A
{
virtual void get();
}
class B: public A
{
void get();
}
class C: public B
{
void get();
}
和
int main()
{
B *i;
i = new C();
i.get();
return (0);
}
如果A :: get()是虚拟的:
i.get()调用C :: get()
如果A :: get()不是虚拟的:
i.get()调用B :: get()
我的问题是:
为什么我不需要在B :: get()上放置虚拟以使用带有B.get()的C :: get()?
答案 0 :(得分:4)
从基类覆盖虚方法的方法也将隐式虚拟 - 这适用于整个ihneritance链。
struct A {
virtual int f(int);
};
struct B : A {
int f(int); // overrides A::f, implicitly virtual
void g(float);
};
struct C : B {
int f(int); // overrides B::f, implicitly virtual
int f(char); // doesn't override anything, not virtual
void g(float); // doesn't override and isn't virtual,
// because B::g is not virtual either.
// It hides B::g instead.
};
答案 1 :(得分:1)
当在基类中声明成员函数 virtual
时,对于所有子类,它将是virtual
。您可以在子类中省略virtual
关键字这一事实并不意味着它不是虚拟的。
您对所提议代码的假设如下:
int main()
{
B* i;
i = new C();
i.get();
return (0);
}
被上述代码won't even compile误导(即使你在每个类声明/定义的末尾添加了分号)。
当您处理指针并且想要调用成员函数时,您可以取消引用指针并使用.
运算符:
(*ptr).function();
或使用->
运算符:
ptr->function();
你的代码都没有。但假设你的意思是:
int main()
{
B* i = new C();
i->get();
}
你的假设结果是正确的:
A::get
是虚拟的,则在i->get
中,C::get
将被称为B::get
。为什么我不需要将
B::get()
上的虚拟内容与C::get()
一起使用B.get()
?
你没有。 void get()
成员函数从基类开始是虚拟的,一直到C
类。您无需重复virtual
个关键字,但我实际上会推荐它。