【问题标题】:How can an pointer of superclass access variables of subclass?超类的指针如何访问子类的变量?
【发布时间】:2016-03-08 08:36:16
【问题描述】:

我有一个类 A 和一个类 B,它继承自类 A。B 类有一个变量和一个函数,而 A 类没有。我做了一个指针

A* ptr=new B();

那么ptr如何访问属于B类的变量和函数呢?

【问题讨论】:

  • 搜索并阅读有关downcasting的信息。
  • 不建议在一篇文章中提出两个不相关的问题 - 您会得到部分或令人困惑的答案。您可以edit您的问题只留下一个问题,或者用更一般的问题替换它们。
  • 至于你的第二个问题,如果你有 one 虚拟成员函数,那么你在子类的基类中只有 one 函数覆盖。它会“正常工作”。
  • 感谢您的推荐。我删除第二个问题。关于第二个问题。我的意思是,A 类有 25 个子类(B 类、C 类……),每个子类都有自己独特的功能(B 类的功能 B,C 类的功能 C,……)。所以我必须在 A 类中创建虚函数 B、虚函数 C... 以允许 A* ptr 使用它们?这是最好的解决方案吗?
  • Joachim Pileborg 是正确的。但是,我建议您花几分钟的时间来了解为什么它会“正常工作”。了解语言的这些基本细微差别非常重要。

标签: c++ function variables pointers inheritance


【解决方案1】:

你可以强制派生类实现基类中定义的纯虚方法:

class A
{
public:
    virtual void do_things() = 0;
};

class B : public A
{
public:
    virtual void do_things()
    {
        //Implementation
    }
};

这样就可以通过指针A*调用B类实现的方法:

A* a_ptr = new B();
//The method implemented in class B will be called
a_ptr->do_things();

您还可以假设a_ptr 指向B 类的对象。如果a_ptr 不指向B,则dynamic_cast<B*> 返回的指针将是nullptr。如果A 中没有虚方法,则可以使用static_cast<B*>

b_ptr = dynamic_cast<B*>(a_ptr);
b_ptr->do_things;

这样你就不需要A类中的纯虚函数了。

【讨论】:

  • dynamic_cast 如果 a_ptr 没有指向 B 类型的对象,则将 null 返回给 b_ptr。您正在考虑 static_cast。
  • 我无法使用第一种解决方案访问 B 类的唯一变量。第二种解决方案对我来说效果很好。谢谢!
  • 你可以创建一个方法来返回你需要的变量的引用。
【解决方案2】:

A 类根本无法“看到”B 类的功能。相反,您必须使用从 A 到 B 的 dynamic_cast 之类的东西,检查是否为空,然后按照您的喜好继续操作。 Here is a nice tutorial to explain this a lot better than I can.每个演员都有自己的优点和缺点;好好学习他们。另外,尽量避免 C 风格的转换。

编辑:似乎我误读了这个问题。不过,答案仍然是正确的。 A 类将无法“看到”B 类的变量。转换仍然允许您访问它们。

【讨论】:

  • 我创建了一个B* ptrB,使用了ptrB=dynamic_cast&lt;B*&gt;(ptrA) 的dynamic_cast,它成功了!谢谢你回答soulsabr。
猜你喜欢
  • 2012-04-09
  • 2021-03-25
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多