用代码覆盖/隐藏/继承问题?

时间:2013-03-04 17:02:34

标签: c++ polymorphism override

使用以下代码我有以下关于隐藏/覆盖的问题:

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

1 个答案:

答案 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 hidingEven if the derived classes say virtual, if the base class doesn't you get function hiding