C ++想要从基类调用派生函数

时间:2011-03-31 10:36:38

标签: c++ virtual

我有以下情况

class base
{
public:

   virtual void Accepted(SOCKET s)  //// Event
   {

   }
   void Listner()
   {
          SOCKET acpted;
          Accepted(acpted); /// When I call I want derived class's Accepted() to get called

   }

};


class derived
{
   virtual void Accepted(SOCKET s)  //// Event
   {
         ////// HERE i will write actual implementation (QUESTION)
   }

}

我想调用派生类的函数。这将像这里的事件一样工作。我想通知派生类在基类中发生了什么。

6 个答案:

答案 0 :(得分:6)

class derived : public base会使derived实际上从base继承。然后您的虚函数调用将按预期工作。

请注意,您无法在base的构造函数或析构函数中进行此类虚函数调用 - 在调用base的构造函数时,derived部分尚不存在。在调用base析构函数时,derived部分已被破坏。

编辑:演示,回应评论。

class base
{
public:
    virtual void Accepted(SOCKET s)  //// Event
    {
        cout << "base::Accepted" << endl;
    }
    void Listner()
    {
        SOCKET acpted = 0;
        Accepted(acpted); /// When I call I want derived class's Accepted() to get called
    }
};


class derived : public base
{
    virtual void Accepted(SOCKET s)  //// Event
    {
        cout << "derived::Accepted" << endl;
    }
};


int main(int argc, char * argv[])
{
  derived d;
    d.Listner();
}

这将打印derived::Accepted

答案 1 :(得分:2)

这可以按照您想要的方式工作。如果您的实际代码不起作用,那么您还没有向我们展示相关的一切。这就是我们恳请您向我们展示真实代码的原因。你认为你是这里唯一一个处理无法在互联网上共享的大代码库的人吗?您如何看待我们其他人获得帮助?写一个小例子来实际复制你正在看到的行为并发布它。不要发布你甚至没有编译过的psudocode。

以下是您可以做的事情,以及您应该如何发布的示例。

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void Accepted()
    {
        cout << "Base::Accepted" << endl;
    }
    void Listener()
    {
        cout << "Base::Listener" << endl;
        Accepted();
    }
};

class Der : public Base
{
public:
    void Accepted()
    {
        cout << "Derived::Accepted" << endl;
    }
};

int main()
{
    cout << "*** BASE ***" << endl;
    Base b;
    b.Listener();

    cout << "\n*** DERIVED ***" << endl;
    Der d;
    d.Listener();
}

输出是:

*** BASE ***
Base::Listener
Base::Accepted

*** DERIVED ***
Base::Listener
Derived::Accepted

答案 2 :(得分:0)

除了派生派生类扩展基类(派生:公共基础)之外,您还可以在基类中声明接受方法纯虚拟:

virtual void Accepted(SOCKET s) = 0;

这样,派生类就被迫实现了可接受的方法。

派生类中的Accepted方法也不需要是虚拟的。

答案 3 :(得分:0)

在代码中进行以下更改。 1)类派生:公共基础 2)创建派生类的对象并调用Listener函数。 (如果要创建基类的对象,则无效)

DHIRAJ

答案 4 :(得分:0)

小心不要在施工或销毁期间调用虚拟功能。错误的实现定义了可能发生的事情:

C++ virtual function from constructor

答案 5 :(得分:-2)

感谢朋友的回答。一切都在技术上是正确的。 我按照方式解决了这个问题

我想通过不将任何方法设为纯虚拟来允许创建类base的对象。

如果我将任何方法设为纯虚拟,那么它将类库作为抽象。

所以我创建了另一个抽象类,其中所有必需的方法都是纯虚拟的,并且我从中派生类库。这样它就可以让我创建基础对象。

e.g。

class __base__
{
public:
   virtual void Accepted(SOCKET s)  = 0 //// Event    
   {     
   }    

};

class base : public __base__
{ 
  public:     
       virtual void Accepted(SOCKET s)  //// Event    
        {     
}    
void Listner()    
{           
  SOCKET acpted;           
  Accepted(acpted); /// When I call I want derived class's Accepted() to get called     
}  
};

class derived : public base
{    
  virtual void Accepted(SOCKET s)  //// Event    
  {          
      ////// HERE i will write actual implementation (QUESTION)    
  }  
}