【发布时间】:2021-06-21 10:07:55
【问题描述】:
我有以下 C++ 代码
AbstractClass_01.h
class AbstractClass_01 {
public:
virtual void method_01() = 0;
};
AbstractClass_02.h
class AbstractClass_02 {
public:
virtual void method_02() = 0;
};
ClassA.h
#include "AbstractClass_02.h"
class ClassA : public AbstractClass_02{
public:
void method_02();
void method_03();
};
ClassA.cpp
#include "ClassA.h"
void ClassA::method_02() {}
void ClassA::method_03() {}
ClassB.h
#include "AbstractClass_01.h"
#include "AbstractClass_02.h"
class ClassB : public AbstractClass_01 {
public:
ClassB(AbstractClass_02& _obj);
void method_01();
private:
AbstractClass_02 &obj;
};
ClassB.cpp
#include "ClassB.h"
#include "ClassA.h"
ClassB::ClassB(AbstractClass_02& _obj) : obj(_obj) {}
void ClassB::method_01() {
static_cast<ClassA&>(obj).method_03();
}
main.cpp
#include "ClassA.h"
#include "ClassB.h"
int main(int argc, char** argv) {
ClassA a;
ClassB b(a);
b.method_01();
return 0;
}
我的问题是我在 ClassB::method_01 中所做的转换是否是常见的 C++ 构造是否是错误设计的标志?
编辑:
ClassB 构造函数接受对AbstractClass_02 而不是ClassA 的引用的原因是我需要传递对所有具有公共接口AbstractClass_02 的各种对象的引用。问题是这个接口不包含method_03。一种可能的解决方案是将该方法附加到接口AbstractClass_02 中,但该方法与method_02 没有凝聚力。
【问题讨论】:
-
就像@Yksis 提到的,这是一个XY 问题。为什么需要在构造函数中使用
AbstractClass_02而不是只使用ClassA? -
如果
ClassB只需要能够将obj作为AbstractClass_02&引用传递,那么obj没有理由不能成为被向上转换的ClassA&。
标签: c++ inheritance casting reference abstract-class