如何在C++中实现"is also"(扩展E语言中使用的方法)?

How to implement "is also" (extending a method, as used in E language) in C++?

本文关键字:语言 方法 C++ 实现 is also 扩展      更新时间:2023-10-16

在我的程序中,我有3个类:GeneralHeader, MACHeader和IPHeader。MAC和IP报头来自General_Header:

//Headers.h
class GeneralHeader {
public:
    bool Valid;
    void PrintMe();
};
struct MACHeader: public GeneralHeader {
    int DestMAC:48;
    void PrintMe();
};
struct IPHeader: public GeneralHeader {
    int Version;
    void PrintMe();
};

我想实现PrintMe()的generdralheader打印其所有成员,然后到扩展的PrintMe()方法MACHeader打印 MACHeader的成员(所以MACHeader.PrintMe()将打印GeneralHeader和MACHeader成员)。IPHeader也是一样——IPHeader. printme()将打印GeneralHeader和IPHeader成员。

在E语言(AOP)中,通过使用"is also"来扩展MACHeader和IPHeader中的PrintMe()方法可以很容易地完成。

你能指导我如何在c++中实现它吗?

非常感谢您的帮助

您想要的是从IPHeaderMACHeaderPrintMe方法调用父类GeneralHeaderPrintMe方法。这可以通过在方法调用前加上父类来实现。例子:

void IPHeader::PrintMe(){
    GeneralHeader::PrintMe(); //Call the super method
    std::cout << "Version: " << Version << std::endl; //Print IPHeader members
}

MACHeader的方法是类似的。

如果你有多态性,也就是说,你想通过超类的指针或引用来调用派生类的PrintMe方法,例如:

GeneralHeader* h = new IPHeader();
h->PrintMe();

则应该在GeneralHeadervirtual中声明该方法。否则,即使h实际上是IPHeader,也只会在上面的代码中调用GeneralHeaderPrintMe。如果你使用c++ 11,你可能想在子类override中声明这些方法,以确保它们覆盖GeneralHeader::PrintMe()

首先显式调用基类方法:

void MACHeader::PrintMe() {
  GeneralHeader::PrintMe();
  std::cout << DestMAC;
}

您可能还想考虑使基类的PrintMe方法为虚方法。(派生类中的显式调用将而不是触发动态分派)

但是,如果所有GeneralHeader 派生都要求首先打印通用头文件,则考虑模板方法模式:
class GeneralHeader {
  virtual void PrintDetails() = 0;
public:
  bool Valid;
  void PrintMe() {
    std::cout << "Validity: " << Valid << 'n';
    PrintDetails();
  }
};
struct MACHeader: public GeneralHeader {
  int DestMAC:48;
  void PrintDetails() {
    std::cout << "Dest: " << DestMAC << 'n';
  }
};
struct IPHeader: public GeneralHeader {
  int Version;
  void PrintDetails() {
    std::cout << "Version: " << Version << 'n';
  }
};

这样,每个派生类都被迫实现PrintDetails方法,作为交换,永远返回的GeneralHeader::PrintMe();是不必要的。

虚方法就是这样做的。重写派生类中的父方法,并在执行自己的工作之前调用父版本。

class GeneralHeader
{
 public:
 virtual void printMe()
 {
  // print all memebers here
 }
};
class IPHeader : public GeneralHeader
{
 public:
 void printMe()
 {
  GeneralHeader::printMe();//to print parent stuff
  //print new stuff here
 }
};

虽然我真的不知道还有在E语言中是什么意思,你的意思是像下面这样吗?

GeneralHeader::PrintMe() {
    std::cout<<"valid: "<<Valid<<std::endl;
}
MACHeader::PrintMe() {
    GeneralHeader::PrintMe();
    std::cout<<"dest MAC: ";
    for (int i=0; i<48; ++i)
        std::cout<<i<<":";
    std::cout<<std::endl;
}
IPHeader::PrintMe() {
   GeneralHeader::PrintMe();
   std::cout<<"Version: "<<version<<std::endl;
}

您需要在派生类中从母类GeneralHeader::PrintMe();调用该函数。

例如,您可以这样做

void MACHeader::PrintMe() 
{ 
   GeneralHeader::PrintMe();
   // ...
} 

还可以使继承多态,将函数声明为虚函数。例如

class GeneralHeader {
public:
    bool Valid;
    virtual void PrintMe();
    virtual ~GeneralHeader();
};