c++ - 相关 C++ 类中多态性的最佳实践?
问题描述
我有几个相互关联的类将被多种不同的算法使用
例子:
struct B;
struct A {
B* parent;
};
struct B {
std::vector<A*> children;
};
每个算法都可能希望根据它们对它们所做的事情来专门化这些类,所以我们推测它们应该从 A 和 B 派生
struct Aderived : A {...};
struct Bderived : B {...};
但是 in 中的方法Aderived
希望将其parent
视为Bderived*
(访问由 添加的方法或成员Bderived
)并且Bderived
希望将其元素children
视为 as Aderived*
。
1) 是否有一种方法可以很好地Aderived
避免Bderived
在每次他们想要分别访问 和 的方法时都parent
必须进行静态强制转换。children
Bderived
Aderived
2)你怎么会得到这样的东西来编译反正你不能转发声明一个类是从另一个派生的......
struct Aderived : public A {
int a;
void x() { static_cast<Bderived*>(b)->b = 1; } // ERROR
};
struct Bderived : public B {
int b;
void x() { static_cast<Aderived*>(avec.back())->a = 1; }
};
解决方案
将 A 和 B 定义为模板:
template < class T1 >
struct A
{
T1* parent;
};
template < class T2 >
struct B
{
std::vector < T2* > children;
};
而继承去:
struct Aderived : public A < Bderived >
{
// ...
};
struct Bderived : public B < Aderived >
{
//...
};
推荐阅读
- swift - 如何使用 Codable Protocol Swift 在 CoreData 中保存自定义类型
- java - Java中的XML大写元素值
- file - 使用 SQR 访问另一台计算机上的文件
- google-cloud-storage - 在谷歌云上托管网站的问题
- pandas - 是否可以在 pandas 数据框中执行相当于 SQL 嵌套请求的操作?
- php - 如何在 WordPress 帖子中更改 h2、h3、h4 的颜色
- android - Android 片段高度
- java - 使用 Eclipse 手动导出 EAR 文件
- regex - 计算 sed 中的字符串长度
- c - 如何在 Linux 中获取显示设备名称