在 C++ 中的 vector 中存储具有双重继承的对象
Store object with double inheritance in vector in C++
假设我得到了以下代码:
#include <string>
#include <iostream>
#include <vector>
struct AddColorToText
{
void MakeItRed(std::string text);
void MakeItGreen(std::string text);
void MakeItBlue(std::string text);
};
所以第一个结构是一个通用结构,可以为我输入的任何文本添加颜色。这只是一个例子;这个想法是第一个结构包含方法,然后我得到另一个具有互补方法的结构:
struct AddEffects
{
void MakeItFlash();
void MakeItFadeGradually();
void MakeItBounce();
};
最后我得到了继承自第一个和第二个结构并提供更多方法的第三个结构:
struct SuperText: public AddColorToText, public AddEffects
{
void SetSize();
void SetFont();
}
现在假设由于某种原因我必须将 superText 对象存储在 AddColorToText 指针的向量中:
SuperText TheSuperTextObject;
std::vector<AddColorToText*> TheVector;
TheVector.push_back(&TheSuperTextObject);
从 AddColorToText 指针向量中取回 SuperText 方法的 best/cleanest 方法是什么?
TheVector[0]->SetSize??????
像这样编辑您的 class 声明以启用多态性:
struct AddColorToText
{
void MakeItRed(std::string text);
void MakeItGreen(std::string text);
void MakeItBlue(std::string text);
virtual ~AddColorToText() {}
};
正如评论中正确指出的那样,您至少需要一个用于多态的虚方法。
那你可以写
SuperText *sup = dynamic_cast<SuperText*>(TheVector[0]);
sup->SetSize();
假设我得到了以下代码:
#include <string>
#include <iostream>
#include <vector>
struct AddColorToText
{
void MakeItRed(std::string text);
void MakeItGreen(std::string text);
void MakeItBlue(std::string text);
};
所以第一个结构是一个通用结构,可以为我输入的任何文本添加颜色。这只是一个例子;这个想法是第一个结构包含方法,然后我得到另一个具有互补方法的结构:
struct AddEffects
{
void MakeItFlash();
void MakeItFadeGradually();
void MakeItBounce();
};
最后我得到了继承自第一个和第二个结构并提供更多方法的第三个结构:
struct SuperText: public AddColorToText, public AddEffects
{
void SetSize();
void SetFont();
}
现在假设由于某种原因我必须将 superText 对象存储在 AddColorToText 指针的向量中:
SuperText TheSuperTextObject;
std::vector<AddColorToText*> TheVector;
TheVector.push_back(&TheSuperTextObject);
从 AddColorToText 指针向量中取回 SuperText 方法的 best/cleanest 方法是什么?
TheVector[0]->SetSize??????
像这样编辑您的 class 声明以启用多态性:
struct AddColorToText
{
void MakeItRed(std::string text);
void MakeItGreen(std::string text);
void MakeItBlue(std::string text);
virtual ~AddColorToText() {}
};
正如评论中正确指出的那样,您至少需要一个用于多态的虚方法。
那你可以写
SuperText *sup = dynamic_cast<SuperText*>(TheVector[0]);
sup->SetSize();