【问题标题】:Accessing Derived class members in base class method在基类方法中访问派生类成员
【发布时间】:2012-09-16 19:06:53
【问题描述】:

我有一个特殊要求,但无法找到解决方案。

class Base
{
public:
    void func()
    {
       //access the member say 'var' of derived class
    }
}
  1. 在我们的例子中,所有来自基类的派生类都必须有成员“var”。
  2. 派生类的名称可以是任何名称。

【问题讨论】:

  • 为什么在Base 中没有var,因为它对所有派生都是通用的?
  • 对于您的“特殊”需求来源,总是有更好的解决方案。与其打破面向对象编程的基本原则,不如更深入地了解为什么会有这样的需求以及用更优雅的解决方案解决它的方法。

标签: c++ class inheritance derived-class base-class


【解决方案1】:

既然派生类中的所有vars 都需要具有相同的类型才能有意义,为什么不简单地将它放在基类中呢?

class Base
{
public:
    void func()
    {
      // use var
    }
protected: // allow derived classes to access 'var'
           // and give it a value on construction
    // where T == whatever type you want
    Base(T v) : var(v){}
    T var; 
};

【讨论】:

  • 我考虑过这个,但我们不想这样实现
  • 这正是应该如何实现的,至少基于 OP 所说的。
  • @HellBoy:请继续这句话:我们不想以这种方式实现它,因为...
  • @HellBoy:请打你的经理。我看不出有任何这样做的理由。
  • @phresnel:所以不是派生类依赖基类,而是基类应该依赖派生类? What.这不是像,颠覆了OO的每一个教学曾经吗?
【解决方案2】:

您需要一个返回该成员的virtual 函数:

class Base
{
public:
    void func()
    {
       getVar();
    }
    virtual int getVar() = 0;
};
class Derived : public Base
{
    int var;
    virtual int getVar() { return var; }
};

更好的设计是在基类中包含var,因为它是一个通用成员。否则,C++ 没有任何反射机制,因此无法以您想要的方式动态检查类。

【讨论】:

  • 使用getVar() 可能是一种更好的方法,因为它的值会在一定程度上得到更新。
  • @MarkGarcia 我不清楚您要在评论中添加什么
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 2017-09-30
  • 2012-08-29
  • 2019-01-20
  • 1970-01-01
  • 2021-12-05
  • 2011-01-27
  • 2015-02-04
相关资源
最近更新 更多