【问题标题】:Base Class Pointer doesn't see members of Derived基类指针看不到派生的成员
【发布时间】:2016-02-23 21:33:59
【问题描述】:

这是我的代码。我不明白为什么我不联系b->x

main.cpp

#include <iostream>
#include "Nesne.h"
using namespace std;

int main()
{
    Derived obj;
    Base *b=&obj;

    b->a=2;
    b->x=3;


    return 0;
}

Nesne.h

#ifndef NESNE_H
#define NESNE_H


class Base
{
   public:
    int a;

    Base();
    virtual ~Base();
protected:
private:
};

class Derived : public Base
{
public:
int x;
  Derived(){};
};

#endif // NESNE_H

【问题讨论】:

  • 我加图片,你可以轻松看
  • 请勿发布文字截图。 Stack Overflow 允许您在问题中实际输入文本。
  • 为什么要达到它?没有Base::x
  • 请不要截图代码。

标签: c++ inheritance polymorphism


【解决方案1】:

继承往另一个方向发展。

指向 Derived 对象的指针可以看到 Base 成员,但指向 Base 的指针无法看到 Derived 成员。数据成员没有virtual,即使对于函数,只有在 Base 中声明它才会是虚拟的。 (virtual 允许您通过 Base 指针或引用访问函数的派生版本)。

既然你想要的成员在那里,虽然不能这样访问,你可以使用static_cast来访问它:

static_cast<Derived*>(b)->x = 3;

【讨论】:

  • 你的意思是 reinterpret_cast ? static_cast 也可以在这里工作,但是 reinterpret_cast 非常确定所需的转换在继承链中。如果不是,则强制转换为 nullptr。 static_cast 不做这个检查,总是返回一个指针,有效或无效,
  • @Viktor Lier 不,我当然不是说reinterpret_cast,你也不应该。 reinterpret_cast 会大错特错。你的意思是dynamic_cast,我还是不同意。 static_castdynamic_cast 之间的选择可以是一个判断电话。但是你对static_cast 的普遍拒绝并不是好的软件工程。
  • 实际上,我会像vector vec那样使用vector;但是我在这里不明白
  • @JSF:是的,我的意思是dynamic_cast 不是reinterpret_cast。我什么时候说普遍拒绝static_cast
  • 您评论中对static_cast 的反对仅作为对派生类的普遍拒绝static_cast 才有意义。在我们正在讨论的示例中,毫无疑问,static_cast 的运行时类型是正确的。所以如果你不喜欢static_cast在这里派生,你会喜欢哪里呢?普通代码充满了这样的情况,在这种情况下,已知指向基类的指针对于派生的静态强制转换是有效的。 dynamic_cast 几乎总是一个开始。然后,您需要测试 NULL 和备用执行路径。大多数情况下没有合理的替代方案。
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2016-10-10
  • 2014-09-12
  • 2016-07-31
  • 2011-01-27
  • 2015-02-04
相关资源
最近更新 更多