c++ - 我应该创建一个类对象吗?

标签 c++ oop inheritance

我是 C++ 的初学者。我目前正在从事一个涉及多个类(class)的项目。我对此有疑问,我有 2 节课 AB , class B有 2 种方法 sendregisterrecievehandler A类使用哪个。我不明白什么时候应该继承。我的思考过程是因为它是一个函数调用,我应该只使用 class B 的方法吗?如static ?我不认为我需要创建一个类型为 B 的类对象因为它只是一个函数调用。
我的问题是应该 class A继承 class B ?

class A{
 //member variables of this class
public:
  senddata(string data){
     send(data)
  }

  createdata(){
    // does something here
    senddata(data); //just an example
 }

  receive(){
     registerrecievehandler(f);
  }

}

class B{ //networking stack
  func_ptr* p
  //other members of this class
public:

 //many member functions here

 
 send(string data){
    //do something
 }
 
 registerrecievehandler(f){
     p =f;
 }

}

最佳答案

My question is should class A inherit class B ?


一般的答案是,“这取决于”。但是,我将使用您问题中的信息和最佳实践来回答您的问题。我们甚至可以将这个问题改写为“一个类什么时候应该继承另一个类?”
我们掌握的信息:
  • 我们有两个类,A 和 B
  • B 类有 2 个成员函数,将在 A 类中使用

  • 有这么多信息的答案很简单。不,在这里进行继承是没有意义的。为什么?因为A正在使用 B .使用 B不需要继承B .
    最佳实践怎么说?在回答这个问题之前,让我们记住一件事,答案或最佳实践并不适用于任何地方和任何情况。有时我们必须考虑我们的问题并创建最适合手头问题的解决方案。
    最佳实践是“最小化耦合”和类之间的依赖关系。您的类/接口(interface)等应该彼此弱链接。这不仅带来了更好的设计,而且使代码更容易修改和维护,并为测试和其他事情开辟了机会。它甚至可能带来更好的性能,但不一定。继承是两个类可以拥有的最强关系形式,它导致强耦合。所以,如果你 A继承 B ,很有可能如果您修改 B ,您可能需要修改A也因此增加了您的工作量并使其难以维护您的代码。
    在您的情况下不使用继承的原因:
  • 您在 B 中没有任何 protected 成员您想在 A 中访问
  • 您没有任何virtual您想在 A 中专门化/覆盖的函数
  • A不觉得它类似于 B
  • A想用B , 所以它应该包含 B (作曲)

  • 什么时候应该使用继承?
    当您想要表达“IS-A”关系时使用继承,例如 Car IS-A Vehicle。我知道这很简单,在开发真正的软件时很难找到或表达这种关系,但我只是在说明一点。

    My thought process is as it is a function call should I just make the methods of class B as static ?. I don't think so I need to create a class object of type B as it's just a function call.


    这部分可能会导致基于意见的答案。
    您可以将它们设为静态并像那样使用它们,但在 C++ 中,我们可以在这种情况下使用更好的工具:namespace .
    您可以制作B一个 namespace然后从任何你想要的地方使用它里面的函数。

    关于c++ - 我应该创建一个类对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63140967/

    相关文章:

    c++ - CMake:如何将编译器标志添加到非默认编译器

    c++ - Windows 中的按键事件

    python - 如何在for循环中从类中获取实例名称

    c# - 获取 "cannot insert NULL into ("架构"."table"."column") 当列不为空时

    c++ - Effective placement of lock_guard - 来自 Effective Modern C++ 的第 16 条

    python - PyQt5:通过小部件方法在 QAction 之后更新 MainApplication 布局

    c++ - 存储和检索对游戏世界中卸载对象的引用

    java - 在匿名对象上调用父类(super class)方法 AsyncTask.execute() new HttpRequestTask<...> extends AsyncTask<...>

    java - java中的初始化顺序,继承和重写字段

    c++ - 使用 ofstream 将多个数组指针写入文件?