使用以下代码我有以下关于隐藏/覆盖的问题:
1)如果我用p调用DoStuff,将调用哪个DoStuff实现?
2)如果我从Drive的Prius实现中删除“virtual”关键字,那么DoStuff(p)仍然有效吗?
3)与上面相同,除了DoStuff(t)?
4)更改Car* c
Toyota *t
(非常欢迎任何不特定于上述问题的一般建议)
class Car
{
public:
virtual void Drive();
};
class Toyota : public Car
{
public:
virtual void Drive();
};
class Prius : public Toyota
{
public:
virtual void Drive();
};
void DoStuff(Car* c)
{
c->Drive();
}
int main()
{
Car* c = new Car();
Toyota* t = new Toyota();
Prius* p = new Prius();
DoStuff(c);
DoStuff(t);
DoStuff(p);
}
答案 0 :(得分:1)
1)如果我用p调用DoStuff,将调用哪个DoStuff实现?
See for yourself(我也修复了你的代码)
2)如果我从Drive的Prius实现中删除“virtual”关键字,那么DoStuff(p)仍然有效吗?
Once virtual, always virtual(也就是说,如果基类将函数声明为virtual
,则派生类中始终为virtual
,无论它们是否为virtual
} < / p>
3)与上面相同,除了DoStuff(t)?
见上文。
4)更改
的Car* c
Toyota *t
我将猜测我已经链接的例子来回答这个问题(希望,因为我不确定这个问题是什么)。
5)如果我从
virtual
移除Car
该怎么办?
你没有问这个问题,但我希望你有。所有前面的例子都必须处理重写。 If you do this, then you get function hiding。 Even if the derived classes say virtual
, if the base class doesn't you get function hiding