C++ 引用和接口(interface)指针之间的不同行为

标签 c++ pointers inheritance reference virtual

我试图为一个变量值编写一个接口(interface)。基类只提供了一个enum字段,其中存储了变量的类型(如intchar等...)和一些虚函数。 继承此接口(interface)的类应各自实现一个变量类型的表示。

#include <iostream>

enum Type
{
    INT, CHAR
};

class Var
{
    Type type;
public:
    Var(Type t):
        type(t)
    {}
    virtual void printValue()
    {
        std::cout << "-\n";
    }
    virtual void printType()
    {
        std::cout << type << std::endl;
    }
};

class IntVar : public Var
{
    int value;
public:
    IntVar(int i):
        Var(INT),
        value(i)
    {}
    void printValue()
    {
        std::cout << value << std::endl;
    }
};

class CharVar : public Var
{
    char value;
public:
    CharVar(char c):
        Var(CHAR),
        value(c)
    {}
    void printValue()
    {
        std::cout << value << std::endl;
    }
};

然后我试了一下:

Var* np = new IntVar(1);

np->printType();
np->printValue();
np = new CharVar('a');
np->printType();
np->printValue();

输出是

0 (Type::INT), 1, 1 (Type::CHAR), a

所以一切都按预期工作,但是当我尝试对引用进行相同操作时,结果有点奇怪。

Var& nr = *(new IntVar(1));
nr.printType();
nr.printValue();
nr = *(new CharVar('a'));
nr.printType();
nr.printValue();

这里的输出是

0 (Type::INT), 1, 1 (Type::CHAR) and 1

为什么代码在使用指针时有效,而在使用引用时却无效?还是我忽略了一些明显的错误?

最佳答案

使用指针的解决方案使nr首先指向一个IntVar,然后指向一个CharVar

使用引用的解决方案创建一个 IntVar 对象,然后为该对象创建一个新名称 (nr),然后根据这些值更改该对象的值CharVar 的。

引用不能像指针那样 rebase 。引用在其整个生命周期中引用同一个对象。

关于C++ 引用和接口(interface)指针之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31358039/

相关文章:

qt - 子类中是否需要调用基类的事件处理器?

c++ - C++中获取/设置方法变量的方法声明的编程风格?

c++ - 替换排序范围内的元素

c - -> 运算符在 C 中起什么作用?

c# - 如何避免调用基类构造函数

.net - 更改作为继承层次结构一部分的( Entity Framework )实体的类型

c++ - 将可变函数作为参数传递

c++ - 反对异常(exception)

c++ - 如何从 C++ 中实例化对象的函数指针调用函数?

c - 什么是指针能做而变量不能做的?