c++ - 如何使用派生类中的函数而不将它们添加到基类中

标签 c++ oop inheritance interface solid-principles

这很可能是一个愚蠢的问题,但我似乎无法弄清楚这是否完全可能以及是否应该实际完成。

说一些代码在很大程度上依赖于使用某个虚拟基类作为接口(interface),然后派生几个实现基类虚拟方法的子类。当程序的其余部分只能看到基类“接口(interface)”时,是否可以使用下面基类(接口(interface))中不存在的功能而不完全无视坚实的原则?就像下面的例子一样,是否可以在只知道 A 的函数中使用 B 类中的 bar() ?我应该只将 bar() 添加到“接口(interface)”吗?

// Base class - "interface"
Class A
{
    public:
        virtual int foo();
}

// Derived class - implementing the "interface" + more
Class B: public A
{
    public:
        int foo();
        int bar();
}

int main()
{

    function(A); // Some magic function that would utlize the bar() method

    return 0;
}

最佳答案

简短的回答是肯定的,使用 dynamic_cast 运算符(但见下文)。魔法函数看起来像这样:

void function(A& a)
{
  B* b = dynamic_cast<B*>(&a);
  if (b)
  {
    // Object is a B...
    b->bar();
  }
  else
  {
    // fallback logic using only methods on A
  }
}

但请注意,许多程序员认为这是一种代码味道。特别是,如果没有办法实现“回退”分支,那么它表明函数应该真正接受 B 并且设计中的某些地方可能有问题。 (然而,在如此笼统地谈论时很难说。)还要注意 dynamic_cast 可能很昂贵,尤其是对于复杂的类层次结构。

如果合理的话,最好以某种方式将特定于B 的逻辑移动到B 类中。您还可以考虑使 bar 方法成为 A 类的成员(A 将提供一些合理的默认实现)。另一种方法可能是创建一个新接口(interface)来保存 bar 方法,并让您的函数接受该类型的对象。 (B 类将实现 A 和新接口(interface)。)

关于c++ - 如何使用派生类中的函数而不将它们添加到基类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999717/

相关文章:

php - 测量类里面函数之间的时间?

c++ - 在 C++ 中作为参数传递的对象中执行方法

oop - 为什么 "Design Patterns"说 'two objects of the same type only need to share part of their interfaces' ?

c# - 在 C# 中创建接口(interface)实例

c++ - 关于C++虚拟继承的问题

c++ - 如何访问 `polymorphic` 的任何子级的 `std::variant` 基类?

c++ - 如何在C++中获取整数数组的元素数量?

c++ - (string)char 类型转换

关于加法运算符重载的 C++ 问题

Python - 覆盖类变量的初始化