请帮助流血的C ++初学者更好地了解纯虚拟类。
我用C ++虚拟机尝试了一个简单的示例,但不确定结果。例如,如果我在另一种编程语言中尝试过与Java相同的输出,则输出为
1->鸣叫
2->鸣叫
但是,这里的输出是
1->喵
2->鸣叫
这是为什么?似乎该类动物的operator =没有作用。那是因为调用了动物类的标准操作符=却什么都不做吗?如何在不使用指针的情况下实现类似于Java的行为?那有可能吗?
下面是一个尽可能简化的代码示例:
#include <string>
#include <iostream>
using namespace std;
class Animal
{
public:
virtual string test() const = 0;
};
class Cat : public Animal
{
public:
virtual string test() const
{
return "Meow";
}
};
class Bird : public Animal
{
public:
virtual string test() const
{
return "Tweet";
}
};
void test_method(Animal &a)
{
Bird b;
a = b;
cout << "1 -> " << a.test() << endl;
cout << "2 -> " << b.test() << endl;
}
int main(int args, char** argv)
{
Cat c;
Animal &a = c;
test_method(a);
return 0;
}
显然,您对a = b
分配行为有一些不切实际的期望。
您的a = b
分配只是将数据从Animal
对象的子Bird
对象复制b
到Animal
所Cat
引用的对象的子对象a
。由于Animal
根本没有数据,因此您a = b
是一个空操作,一个空操作。它什么也没做。
但是,即使它确实做了一些事情,也只会复制数据字段。它不能复制对象的多态身份。无法在C ++中更改对象的多态身份。无法更改对象的类型。无论您做什么,aCat
都将始终保持a Cat
。
您编写的代码可以简化为
Cat a;
Bird b;
(Animal &) a = b; // Same as `(Animal &) a = (Animal &) b`
a.test(); // still a `Cat`
b.test(); // still a `Bird`
您以更加混乱的方式完成了同一件事。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句