【问题标题】:How does resolution of class member identifiers works in c++类成员标识符的解析如何在 C++ 中工作
【发布时间】:2017-05-03 05:54:24
【问题描述】:

假设你有一个 Ball 类,并且在 Ball.h 中你有

class Ball {
public:
    int foo();
};

其 Ball.cc 文件具有该功能

int Ball::foo(){
    return 5;
}

然后你有一个 BigBall 类

#include <Ball.h>

class BigBall : public Ball {
public:

};

然后在你的主体中你制作一个 BigBall

auto bigRed = make_shared<BigBall>():

您将如何在bigRed 对象上使用foo();

类似的东西

Ball::bigRed->foo();

但我被告知球无法解决....

【问题讨论】:

  • 您正在使用automake_shared,但您不知道继承是什么?我建议您从一本初学者书籍开始学习基础知识。

标签: c++ oop c++11 inheritance


【解决方案1】:

你只需要这个:

BigBall ball;
ball.foo();

这会创建一个名为ball 的对象,类型为BigBall,并调用foo()。您无需执行任何特殊操作即可调用在基类中定义的函数。直接调用吧。

automake_shared 的东西现在只是分散注意力。

【讨论】:

    【解决方案2】:

    使用std::shared_ptr,您可以像这样使用-&gt; 运算符:

    auto foo = bigRed->foo();
    

    享受吧!

    【讨论】:

      【解决方案3】:

      几乎。您需要对函数标识符进行解析,而不是对象:

      bigRed->Ball::foo();
      

      但除非BigBall 重载并隐藏原始Ball::foo,否则您实际上不需要解决任何问题:

      bigRed->foo();
      

      【讨论】:

      • 嗯,我仍然得到一个错误,它是对 Ball::Ball 的无效使用,并且该方法 foo 无法解析
      • 你的第二种方式用 Ball::foo(); 声明一个未定义的引用;
      • hmmm 也许就是这种情况,我对此很陌生,只是使用 Eclipse 构建器。但没有尝试在这里使用继承,我的程序运行良好,其中包含大约 20 个类
      • @sam 如果类BigBall 继承自Ball,则Ball 必须链接到BigBall。这就是 c++ 对象模型的工作原理。
      猜你喜欢
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多