繁体   English   中英

C ++派生类-从父类调用虚函数?

[英]C++ Derived Classes - Calling a virtual function from the parent class?

对于使用C ++编写大型程序包,我还比较陌生,因此对这种语言的某些OOP技术并不完全熟悉。

我正在编写可以运行模拟以在各种模型的框架内计算材料变形的代码。 我使用诸如set_boundary_conditions()update_grid()solve()等方法来set_boundary_conditions() Sim类。

我想将各种模型实现为派生类。 例如,如果您只想考虑线性弹性方程,用于塑性的PlasticSim等,我将拥有一个从Sim派生的ElasticSim类。

因为模型定义了必须解决的方程式,这些方程式已包含在update_grid()函数中,所以我将update_grid() virtual以便可以针对每个模型以不同的方式实现该方程式。 此外, set_boundary_conditions()更加具体-给定模型中的不同模拟将具有不同的边界条件,因此在Sim和任何派生类中这都应该是virtual 将存在另一个派生类,该类实现给定物理情况的边界条件。

这可能过于复杂,但是我认为这是解决此问题的非常模块化且用途广泛的方法。 但是我离题了。 我有一个主要问题。

首先,每个模型的solve()方法都将相同。 因此,我想在Sim定义它。 但是,它调用了virtual函数,这些virtual函数将在以后由派生类实现。 即,在伪代码和c ++的混用中:

Sim::set_boundary_conditions()
for every time step...
    Sim::update_grid()

在我可以正确测试之前,会有很多编码,而且我一直无法在线找到合适的答案。 这真的有意义吗? 特别是,尽管这些函数实际上将分别在派生类的派生类和派生类中实现,但我正在调用Sim::update_grid()Sim::set_boundary_conditions()

这真的有意义吗?

是的,对于Sim::solve ,它是非虚拟的并调用虚拟函数是完全可以的。 构造函数和析构函数仅是必须注意虚拟调用的情况(因为vtable可能尚未完全形成或已被破坏)。

NVI(非虚拟接口)在某个时候可能对您有用。 这个想法包括对公共接口使用非虚拟方法,对受保护/私有方法使用虚拟方法。 这个想法是允许集中控制,但仍然允许某些部分的可覆盖性。 例:

class Foo
{
public:
    virtual ~Foo() {}

    // public non-virtual interface: calls virtual interface.
    void do_something()
    {
        // Can add central stuff here that affects the 
        // entire hierarchy at any given time.
        do_something_impl();
    }

private:
    // subclasses can override this part.
    virtual void do_something_impl() = 0;
};

这种设计留出了摆动的空间,可以做一些适用于整个层次结构的集中工作(预见或事后观察),同时允许子类部分覆盖行为并导致新的代码子分支。

但是,在基类中定义的调用虚拟方法的中央sim方法所具有的功能很好。 这将使它成为一个混合了具体实现和可重写接口的抽象基类,而不是没有任何具体实现的纯虚拟接口,例如,从同一意义上讲,值得注意的是,您可以为虚拟函数提供默认实现-并非所有方法在基类中,必须是纯虚函数,甚至根本就是虚函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM