如何在C++中实现"is also"(扩展E语言中使用的方法)?
How to implement "is also" (extending a method, as used in E language) in C++?
在我的程序中,我有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++中实现它吗?
非常感谢您的帮助
您想要的是从IPHeader
和MACHeader
的PrintMe
方法调用父类GeneralHeader
的PrintMe
方法。这可以通过在方法调用前加上父类来实现。例子:
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();
则应该在GeneralHeader
类virtual
中声明该方法。否则,即使h
实际上是IPHeader
,也只会在上面的代码中调用GeneralHeader
的PrintMe
。如果你使用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();
};
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- 当使用Lua作为嵌入式语言(比如c++)时,有什么简单/方便的方法可以找到变量在Lua中的定义位置吗
- 对于不同的语言,是否有任何稳定的序列化方法?
- 用各种语言表示模式的方法
- 是在 C 或 C++ 析构函数中模拟 GO 语言 defer 的实用方法
- 是否有一种方法可以更准确地确定两种语言中的哪种语言中的哪种方法
- 动态C++与其他语言的比较 - 在不知道类型的情况下无法在对象上调用方法
- 在.NET语言之间共享类方法
- Microsoft的源注释语言(SAL) - 有什么方法可以利用它吗?
- 什么是编程语言为派生类重新定义方法的能力
- 在Eclipse中使用不同编程语言的方法是什么?
- 安装QA应用程序的翻译方法不更改语言
- 只移植一个类的方法到C语言
- 找到一种有效的方法,使用 Python 作为"glue"将不同的语言库集成到一个项目中
- 类似qml的方法或编程语言
- 在 C 语言中将浮点指针重新转换为双指针的最有效方法是什么?
- 为什么有些语言更喜欢静态方法绑定而不是动态方法绑定
- 如何在C++中实现"is also"(扩展E语言中使用的方法)?