c++设计(基类中的行为,派生类中提供的私有成员)

C++ Design (behavior in base class, private member supplied in derived class)

本文关键字:成员 设计 基类 c++ 派生      更新时间:2023-10-16

我有6类都执行相同的动作。我想把共同的行为移到共同的[基]类中。

有6个单独的对象要执行的操作。这六个对象位于派生类中。直观地说,私有成员对象可以通过基类中的子类(派生类)来访问。

我正在寻找的c++模式是什么?

class Base
{
  // Common behavior, operate on m_object
  ...
  void Foo()
  {
    m_object.Bar();
  }
};
class Derived1 : public Base
{
  // No methods, use Base methods
  private:
  MyObject1 m_object;
}
class Derived2 : public Base
{
  // No methods, use Base methods
  private:
  MyObject2 m_object;
}

使我陷入这种情况的是MyObject1, MyObject2等提供Bar(),但不共享公共基类。我真的无法修复派生,因为对象来自外部库。

如果在派生类中引入它们,则基类不能直接访问它们。基类如何知道所有派生类都有一个特定的成员?

你可以像这样使用虚拟保护方法:

class my_base
{
protected:
    virtual int get_whatever();
    virtual double get_whatever2();
private:
    void process()
    {
       int y = get_whatever();
       double x = get_whatever2();
       //yay, profit?
    }
}
class my_derived_1 : my_base
{
protected:
    virtual int get_whatever()
    {
        return _my_integer;
    }
    virtual double get_whatever2()
    {
       return _my_double;
    }
}

另一种可能性(如果您想从派生类调用基方法)是简单地向基方法提供参数。

class my_base
{
protected:
    void handle_whatever(int & arg);
};
class my_derived : my_base
{
    void do()
    {
      my_base::handle_whatever(member);
    }
    int member;
};

c++有和没有。它具有非常强大的多重继承支持,因此没有super关键字。为什么?假设您的基类由另外两个类继承,或者甚至是虚拟继承层次结构的一部分。在这种情况下,你不能真正告诉super应该是什么意思。另一方面,有虚拟方法,您总是可以在基类中拥有它们并在派生类中实现(这就是像Java这样的语言所做的,除了它们没有多个类继承支持)。如果您不想使用多态性,您可以使用如下内容:

#include <cstdio>
template <typename T>
struct Base
{
    void foo ()
    {
        std::printf ("Base::foon");
        static_cast<T *> (this)->bar ();
    }
};
struct Derived : Base<Derived>
{
    void bar ()
    {
        std::printf ("Derived::barn");
    }
};
int
main ()
{
    Derived d;
    d.foo ();
}

这是一个非常简单的例子——你可以用访问控制、友元、编译时断言等来扩展上面的例子,但是你明白了。

您考虑过不使用继承吗?

class FooBar
{
   MyObject m_object;
public:
   FooBar(MyObject m): m_object(m) {}
   //operate on different m_objects all you want
};

如何从一个公共基类派生六个独立的对象?然后,您可以在该基类中声明虚拟方法来创建接口,然后在派生对象类中实现它们。

也许你只需要一个模板而不是超类和6个派生类?

似乎您需要访问的不是父字段,而是子字段。您应该通过引入一个抽象方法来实现:

class ParentClass
{
  public:
    void f();
  protected:
    virtual int getSomething() = 0;
};
ParentClass::f()
{
    cout << getSomething() << endl;
}
class DerivedClass : public ParentClass
{
  protected:
    virtual int getSomething();
}
DerivedClass::getSomething() { return 42; }

如果你需要访问父类的方法,只需使用ParentClass::method(...):

class ParentClass
{
  public:
    virtual void f();
};
class DerivedClass : public ParentClass
{
  public:
    virtual void f();
};
void DerivedClass::f()
{
    ParentClass::f();
}