-1

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

1) 如果我用 p 调用 DoStuff,将调用哪个 DoStuff 实现?

2) 如果我从 Drive 的 Prius 实现中删除“virtual”关键字,DoStuff(p) 是否仍然有效?

3) 同上,除了 DoStuff(t)?

4) 更改Car* cToyota *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);
}
4

1 回答 1

1

1) 如果我用 p 调用 DoStuff,将调用哪个 DoStuff 实现?

自己看看(我也修复了你的代码)

2) 如果我从 Drive 的 Prius 实现中删除“virtual”关键字,DoStuff(p) 是否仍然有效?

一次是虚拟的,总是虚拟的(也就是说,如果基类将函数声明为virtual,它总是virtual在派生类中,无论它们是否声明virtual

3) 同上,除了 DoStuff(t)?

看上面。

4) 更改Car* cToyota *t

我将猜测我已经链接到回答这个问题的例子(希望,因为我不确定这个问题在问什么)。

5) 如果我virtual从中删除Car怎么办?

你没有问这个问题,但我希望你问过。前面的所有示例都必须处理覆盖。如果你这样做,那么你会得到功能隐藏即使派生类说virtual,如果基类没有你得到函数隐藏

于 2013-03-04T17:16:27.670 回答