奇怪的行为C ++纯虚函数

优先级99

C ++纯虚拟类的怪异行为

请帮助流血的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对象复制bAnimalCat引用对象对象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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

奇怪的行为C ++纯虚函数

来自分类Dev

C ++纯虚函数调用的性能差异

来自分类Dev

D中的C ++ DLL(纯虚函数)

来自分类Dev

C ++ 11中的纯虚函数

来自分类Dev

D中的C ++ DLL(纯虚函数)

来自分类Dev

关于纯虚函数的C ++设计原理?

来自分类Dev

使用纯虚函数定义在C ++类之外?

来自分类Dev

C ++ 11线程,错误调用了纯虚函数

来自分类Dev

C ++ 11构造函数继承和纯虚方法

来自分类Dev

C ++标准库中是否有纯虚函数?

来自分类Dev

C ++将基本类型传递给纯虚函数

来自分类Dev

C ++:通过调用纯虚函数避免重复

来自分类Dev

使用纯虚函数在C ++类之外定义?

来自分类Dev

具有纯虚函数的模板类的C ++语法?

来自分类Dev

C ++:从同一类的成员函数调用纯虚函数

来自分类Dev

C ++用纯虚方法重写纯虚方法

来自分类Dev

如何将C ++类转换为托管类并在其中调用纯虚函数?

来自分类Dev

将主体添加到C ++中的纯虚/抽象函数中?

来自分类Dev

C++11 中默认纯虚析构函数的正确放置

来自分类Dev

纯虚函数实现

来自分类Dev

关于C ++中构造函数的奇怪行为

来自分类Dev

C代码的奇怪行为(fgets函数)

来自分类Dev

纯虚函数覆盖虚函数

来自分类Dev

纯虚函数覆盖虚函数

来自分类Dev

C ++虚函数覆盖

来自分类Dev

C ++虚函数

来自分类Dev

C ++虚函数覆盖

来自分类Dev

使用虚函数的C ++

来自分类Dev

在某些情况下,使用std :: set_terminate无法捕获C ++纯虚函数调用吗?