2016-09-25 84 views
-1

我需要派生类调用其新函数,如下所示。我已经尝试了很多不同的变体和关键字的位置。继承并使用派生函数

我使用两种方法创建基类预加载加载。 PreLoad的目的是加载总是需要加载的东西,而加载用于加载它需要的功能。

class Base 
    { 
    public: 
     Base(); 
     void PreLoad(); 
     virtual void Load(); 
    }; 

    Base::Base() { 
     PreLoad(); 
    } 

    void Base::PreLoad() { 
     Load(); 
    } 

    class Derived : public Base { 
    public: 
     virtual void Load() { 
      std::cout << "Hia" << std::endl; 
     } 
    }; 

    int main() 
    { 
     Derived d = Derived(); 
     d.PreLoad(); 
     return 0; 
    } 
+0

要使多态性正常工作,您需要使用引用或指向* base *类的指针。然后,您将引用或指针初始化为引用/指向派生对象的指针。例如。 'Base * base = new Derived;'这实际上是指针在现代C++中很有用的少数情况之一。但是,在“现代”C++中,会使用一个类似['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)的智能指针,就像'std :: unique_ptr base(new Derived);' –

+0

@πάνταῥεῖ这就是为什么我试图描述我的问题... –

+1

我不明白你的意思[按预期工作](http://coliru.stacked-crooked.com/a/f22d7d3fb686cb31)。 –

回答

3

您的代码在基类中缺少Load的实现。你这里有两种选择:

  • Load()纯虚 - 这个选项是好当的子类必须覆盖Load()Demo
  • 提供默认实施Load() - 这个选项是好当的班有覆盖Load()的选项,但默认实现是存在的。 Demo
+0

这实际上不是我的代码。这是问题的模型。我目前有一个Load的默认实现。然而派生类只会调用默认实现。 –

+0

@Zyneak这意味着你不会像你的“主”表演那样调用它。我添加了第二个具有默认实现的演示,它工作得非常好。 – dasblinkenlight

+0

这是正确的。实际发生的是构造函数中的类PreLoad。我不认为它有相关性。 –

1

你的代码真正的问题(假设你确实提供了Base :: Load()的实现)是从Base的构造函数中调用虚拟方法(Load)。

当调用Base构造函数时,子(Derived)没有完全实例化。所以重载Load将永远不会被调用。

+0

这是正确的,但它是一个事后编辑,因为那时我并不认为它是相关的。 –