0我在C ++上生气了。我尝试了各种搜索,但无法得出答案。我有以下代码:
class Base
{
public:
Base() {};
virtual void hello() { std::cout << "I'm the base class" << std::endl; }
};
class Alice : public Base
{
public:
Alice() {};
virtual void hello() { std::cout << "I'm Alice" << std::endl; }
};
class Bob : public Base
{
public:
Bob() {};
virtual void hello() { std::cout << "I'm Bob" << std::endl; }
};
Base test(int alice)
{
if(alice)
return Alice();
else
return Bob();
}
int main()
{
Base a = test(0);
Base b = test(1);
a.hello();
b.hello();
}
我希望输出为
I'm Alice
I'm Bob
但是它是
I'm the base class
I'm the base class
除了Python-on-the-brain之外还有什么?
答案 0 :(得分:3)
test
的返回类型为Base
。这意味着它仅返回Base
和Base
s。将不会从该函数返回Alice
或Bob
s。当您执行return Alice();
或return Bob();
这些对象的Base
部分时,切片并返回。
同样,a
中的对象b
和main
属于Base
类型,而且它们都是“{1}}”。这就是为什么当您致电hello
时,您正在调用Base
实施。
在C ++中,您可以通过使用指针或引用来利用多态性。也就是说,Base*
或Base&
可以指向或引用Alice
或Bob
对象。然后,当您尝试通过该指针或引用调用虚拟成员函数时,将通过查看对象的运行时类型来确定该函数的相应实现。
作为一个简单的测试,您可以动态分配Alice
和Bob
个对象并返回指向它们的指针:
Base* test(int alice)
{
if(alice)
return new Alice();
else
return new Bob();
}
您需要将a
和b
设为Base*
,然后使用a->hello()
调用hello。但是,如果您动态分配这样的对象,则必须记住delete
它们。更好的是,使用像std::unique_ptr
这样的智能指针,多态性仍然有效。
另请注意,如果要以多态方式使用这些类型,则应实现虚拟析构函数。