【问题标题】:Casting from an abstract base class reference to derived class reference从抽象基类引用转换为派生类引用
【发布时间】: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&amp; 引用传递,那么obj 没有理由不能成为被向上转换的ClassA&amp;

标签: c++ inheritance casting reference abstract-class


【解决方案1】:

这被称为downcasting,通常是糟糕设计的标志。基于我们所掌握的有限知识,显然您应该在构造函数中使用ClassA 而不是AbstractClass_01

#include "AbstractClass_01.h"
#include "ClassA.h"

class ClassB : public AbstractClass_01 {
public:
    ClassB(ClassA & _obj);
    void method_01();
private:
    ClassA &obj;
};

但我们不知道您的真正问题以及您为什么决定首先使用强制转换或接受接口。

【讨论】:

  • 感谢您的回复。请查看我插入问题的编辑。
猜你喜欢
  • 1970-01-01
  • 2014-03-09
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 2012-01-24
  • 1970-01-01
  • 2011-05-11
相关资源
最近更新 更多