【问题标题】:C++ choose base class to inherit fromC ++选择要继承的基类
【发布时间】:2021-11-08 13:38:24
【问题描述】:

我有一个类“Parent1”和另一个“Parent2”,它们象征着设备“子类”的不同硬件实现。实现这一点的最优雅的方式是什么?我曾考虑过使用模板,例如

class Parent1{
public:
   Parent1():
   void run();
};

class Parent2{
public:
   Parent2():
   void run();
};

template<typename Parent>
class Subclass : Parent {
public:
    Subclass();
    void doSomething(){Parent:run();}
}:

但是子类不知道基类的run()函数。

我还考虑让子类成为接口类,子类需要从父类继承的方法是纯虚函数,然后在从所选类继承的另一个子类中指定。

我相信这对于这个特定的应用程序来说是可以的,因为我需要虚拟化的方法并不多,但我想知道这是否会扩展。所以我的解决方案应该是这样的。

class Subclass {
public:
    Subclass();
    virtual void run()=0;
    void doSomething(){run();}
}:

class SubSubclass1 : Subclass, Parent1{
public:
    SubSubclass1():Subclass(),Parent1(){}
    void run(){Parent1:run();}
};

class SubSubclass2 : Subclass, Parent2{
public:
    SubSubclass2():Subclass(),Parent2(){}
    void run(){Parent2:run();}
};

但我想知道是否有更好的方法来做到这一点?

非常感谢!

【问题讨论】:

  • But then the Subclass does not know the run() function from the base class. 确实如此。
  • “但是子类不知道基类中的 run() 函数。” - 你能详细说明一下这个说法吗?为什么不能调用基类函数?
  • 一旦你用:修复了各种问题,你的原始代码就会编译,在C++中Subclass不需要知道run()来自哪里。
  • Parent1(): 应该是 Parent1();Parent2:run(); 应该是 Parent2::run(); 并且 Subclass 应该在类声明中使用 ; 而不是 :
  • 你在倒退。查找多态性。

标签: c++ object oop templates inheritance


【解决方案1】:

为什么不为两个“父母”实现一个基接口类?

class IBase
{
    virtual ~IBase();
    virtual void run(); 
};

class Parent1 : public IBase
{
public:
   Parent1();
   void run(); // implement
};

class Parent2 : public IBase
{
public:
   Parent2();
   void run(); // implement
};

然后您可以使用 IBase 指针指向实际的“父”对象。

更新: 使用示例

int main()
{
    Parent1 p1;
    Parent2 p2;
    IBase* basePtr;
    
    basePtr = &p1;
    basePtr->run(); // runs Parent1::run() for p1

    basePtr = &p2;
    basePtr->run(); // runs Parent2::run() for p2

    return 0;
}

【讨论】:

  • 谢谢,您能否详细说明一下指向实际父对象的 IBase 指针是什么意思?我会以什么方式告诉子类使用哪个父类?
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多