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

原文 标签 c++ inheritance reference virtual

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

请帮助流血的C++初学者更好地了解纯虚拟类。

我用C++虚拟机尝试了一个简单的示例,但不确定结果。
例如,如果我在另一种编程语言中尝试过与Java相同的输出,则输出为

期望/预期输出

1 -> Tweet
2 -> Tweet



但是,这里的输出是

实际产量

1 -> Meow
2 -> Tweet



这是为什么?
似乎该类动物的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对象Birdb子对象复制到Animal引用的Cat对象的a子对象。由于Animal根本没有数据,因此a = b是一个空操作,是一个空操作。它什么也没做。

但是,即使它确实做了一些事情,也只会复制数据字段。它不能复制对象的多态身份。无法在C++中更改对象的多态身份。无法更改对象的类型。无论您做什么,Cat将始终保持为Cat

您编写的代码可以简化为

Cat a;
Bird b;

(Animal &) a = b; // Same as `(Animal &) a = (Animal &) b`

a.test(); // still a `Cat`
b.test(); // still a `Bird`

您以更加困惑的方式完成了同一件事。

关于c++ - 奇怪的行为C++纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21539045/

相关文章:

c++ - 如何使-Wl,-y可用于C++代码

javascript - Angularjs 1.x中的Typescript继承

c++ - 基类指针仅获得派生类变量值,而不得到基类变量值,为什么?

java - JAVA中类的引用大小

c++ - LLVM 的 GCC 工具链

javascript - 需要有关如何为文本框分配正确值的逻辑方面的帮助

java - 将父类(super class)实例传递给其构造函数是更好的做法吗?

c# - 现有 COM 引用出错或添加新的 COM 引用

c++ - 关于通过引用传递论点的澄清

c++ - C++宏定义相互依赖的类