在此代码中,我定义了三个结构: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
。如果我将 dp
和 mdp
声明为 衍生*
类型的指针,则代码将打印 衍生\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/