为什么此虚拟方法返回true?

詹姆斯·高

在学习有关C ++中的多态性的教程时,我看到一些代码在调用非重写虚拟方法时似乎表现得很奇怪。这些是类:

// classes.cpp

namespace Classes
{
    class C
    {
    public:
        virtual bool has_eyesight()
        {
            return false;
        }
    } c;

    class See : public C
    {
    public:
        bool has_eyesight() override
        {
            return true;
        }
    } si;
}

这是主要方法:

// file.cpp

#include <iostream>
#include "classes.cpp"

using std::cout;
using std::endl;
using Classes::C;
using Classes::See;

int main()
{
    See& si = Classes::si;

    cout << si.has_eyesight() << endl;

    C& c = si;

    cout << c.has_eyesight() << endl;

    c = Classes::c;

    cout << c.has_eyesight() << endl;
}

1 1 1运行时将打印此代码(true true true);c.has_eyesight()如果引用的是C而不是See,则不应返回false?

(如果听起来很天真,请原谅我,我才刚刚开始学习C ++。)

埃博麦克

让我们来看看您在这里所做的事情。

C& c = si;

c现在是的引用Classes::si,它是的实例See因此,其vtable指向的vtable Seehas_eyesight()并将返回true。

引用和指针之间的主要区别是您无法修改其目标-不管您做什么,c现在都将始终指向Classes::si它。意义...

c = Classes::c;

这不会更改对的引用Classes::c您不能修改参考。相反,它调用C上的赋值运算符,所以现在你复制Classes::cClasses::si除非您超载operator=否则将进行逐成员复制。它不会修改vtable,因此has_eyesight()将继续返回true。

如果确实要使其指向其他对象,则必须使用一个指针:

See* si = &Classes::si;
cout << si->has_eyesight() << endl;
C* c = si;
cout << c->has_eyesight() << endl;
c = &Classes::c;
cout << c->has_eyesight() << endl;

尝试这个。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么调用此虚拟方法?

为什么此if语句总是返回true

为什么此Javascript RegExp返回true?

为什么在编译时选择此虚拟方法的实现?

为什么此代码仅对超级用户返回true

为什么此JavaScript if语句总是返回true?

为什么此定义返回False而不是True?

为什么此IF,OR和AND函数不返回TRUE?

为什么此代码返回false而不是true?

为什么FakeItEasy会引发此异常,以及为什么使该方法虚拟修复呢?

为什么此方法返回“ null”而不是null

为什么即使在调用此mutator方法后仍返回错误?

在C语言中,当满足条件使其返回true时,为什么此函数返回false?

为什么使用存储在虚拟方法表中的地址对虚拟函数的函数调用返回垃圾?

为什么在满足条件时该方法不会返回 true?

为什么调用'is_a?方法中的“对象”返回“ true”?

尽管满足 true 的条件,为什么方法返回 false?

为什么if语句返回`true`?

为什么if语句返回True?

即使此转换不合法,为什么std :: is_convertible_v返回true?

java中的字符串“ ==”检查引用,为什么此代码返回true?

为什么此代码段应返回“ false”时输出“ true”?

为什么'$ true -eq“ string”'返回$ true?

为什么此方法返回lambda取决于接口方法的返回类型?

为什么当[[]是[]]而'{}是{}'返回False时,'()是()'返回True?

为什么lodash`_.all([true,true,true],true);`返回`false`?

为什么此方法失败?

为什么此查询从Firestore返回零

为什么此Django表单返回unicode?