我试图输出以下内容:
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();
}
答案 0 :(得分:2)
您无法使用当前设置将“apple banana orange banana”作为输出,因为:
Red *pR1
打印“apple banana”,您必须使Foo
和Bar
虚拟。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在通过基指针使用时实际覆盖行为,则它不应该是虚拟的。你的代码有点令人困惑。没有人会这样做。