为了输出特定的项目,哪些功能需要是虚拟的?

时间:2010-12-13 17:39:57

标签: c++ oop virtual-method

我试图输出以下内容:

apple
banana
orange
banana

我必须将我的功能设为虚拟才能输出吗?

class Red
{
public:
    void PrintMe() { Foo(); Bar(); }
    void Foo() { printf("pear\n"); }
    void Bar() { printf("lemon\n"); }
};

class Green : public Red
{
public:
    void PrintMe() { Bar (); Foo(); }
    void Foo() { printf("apple\n"); }
    void Bar() { printf("banana\n"); }
};

class Blue : public Green
{
public:
    void Foo() { printf("orange\n"); }
    void Bar() { printf("grape\n"); }
};
int main(int argc, char* argv[])
{
    Green g;
    Blue b;

    Red *pR1 = &g;
    Red *pR2 = &b;
    pR1->PrintMe();
    pR2->PrintMe();
}

6 个答案:

答案 0 :(得分:2)

您无法使用当前设置将“apple banana orange banana”作为输出,因为:

  1. 要使用Red *pR1打印“apple banana”,您必须使FooBar虚拟。
  2. 将函数声明为virtual后,它将在所有派生类中保持不变。
  3. 现在Bar是虚拟的,pR2->PrintMe()将打印出“橙色葡萄” - 它无法打印出“香蕉”。

答案 1 :(得分:0)

是的,否则你打印两个红色。

答案 2 :(得分:0)

Red::Foo()Red::Bar()需要是虚拟的。

答案 3 :(得分:0)

您的代码似乎存在一些问题:您定义了一个名为 red 的类,但 Green 继承自名为 Red 的类

无论如何,如果red是你的基类,并且你希望其他类覆盖它的方法,你需要将它们声明为 virtual

答案 4 :(得分:0)

简短回答:PrintMe()需要是虚拟的。

说明:

由于要调用基类指针指向的专用对象的方法,因此需要将该方法设置为虚拟。

// Base class pointer pointing to specialized class
Red *pR1 = new Green();

// If PrintMe() is not virtual, this call will be Red::PrintMe(). 
// If you want to call Green::PrintMe, make it virtual.
pR1->PrintMe();

答案 5 :(得分:0)

LOL!没人能把这个弄好!

您需要将PrintMe设为虚拟,因为foo / bar的顺序可以更改。

你需要让Foo和Bar虚拟,因为他们做了不同的事情。

您需要将DESTRUCTOR设置为虚拟,因为您正在实现多态的高层次结构。这个甚至根本不在您的代码中。您的特定测试main()不需要它,但最合理,非平凡的用途会。

编辑:好的,也许我也弄错了。如果您不希望PrintMe在通过基指针使用时实际覆盖行为,则它不应该是虚拟的。你的代码有点令人困惑。没有人会这样做。