c++ - 在派生类中将函数声明为虚拟函数是否有代码味道?

标签 c++

在此代码中,我定义了三个结构:base衍生MoreDerived,每个结构都继承自列表中的前一个成员。

但是,我已将函数 f() 在派生函数中定义为虚拟函数 结构体,位于基本结构体中。

#include <iostream>
struct base {
    void f() {
       std::cout << "base\n";
   }
};
struct derived : base {
    virtual void f()  { 
        std::cout << "derived\n";
    }
};

struct morederived : derived {
     void f()  { 
        std::cout << "more derived\n";
    }
};

int main()
{
    derived d;
    morederived md;

    base* dp = &d; 
    base* mdp = &md; 
    dp->f(); 
    mdp->f(); 

}

上面的代码按预期打印 base\n base 。如果我将 dpmdp 声明为 衍生* 类型的指针,则代码将打印 衍生\n 更多衍生 再次符合预期,因为 f 在派生中被定义为虚拟的。

当然,这段代码很小,因此结果是可以预测的。但在大型代码库中,执行上述操作是一个好主意吗?

注意:以我有限的 C++ 经验,我还没有在任何代码中看到过这种情况,我也没有任何计划使用这样的模式(或反模式:-D)。我问这个纯粹是出于好奇。

编辑:我不认为这个问题与指出的问题不重复。我不是问派生类中是否需要 virtual 关键字。我问的是,将 virtual 关键字放在函数 f() 上的效果/优点/缺点,该函数在基类中具有实现,但仅在派生类中声明为 virtual,然后被继承由其他类(class)。 具体来说,我想问这个东西是模式还是反模式。

最佳答案

是的,这违反了 Is-a 契约。您的派生游戏的规则与基础游戏的规则不同。

这绝不是一个好主意。您可能需要考虑派生的组合。即

struct derived {
    base b; // for whatever use you might have for base.
    virtual void f()  { 
        std::cout << "derived\n";
    }
};

关于c++ - 在派生类中将函数声明为虚拟函数是否有代码味道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43577669/

相关文章:

c++ - 使用 C++ 容器最小化内存开销(std::map 和 std::vector 太贵了)

c++ - Visual Studio 无法识别某些类

c++ - 将临时 istringstream 对象传递给 istream_iterator<string>

c++ - 模板化类方法定义语法

c++ - 尝试为图像缓冲区分配内存时错误的 ptr 值

c++ - 具有继承的C++中的段错误

c++ - Visual Studio 2013 C++ IntelliSense 显示建议,但不会通过按任何成员列表提交字符来提交建议

c++ - 来自 typedef 的自定义类型作为 Qt MetaType

c++ - 来自现有代码的 Visual Studio 2010 新 C++ 项目

c++ - Solaris 11 上 Sun 提供的 GCC 的 _blsr_u64 header ?